如何删除嵌套属性?

6
我有这个JSON文件:http://danish-regional-data.googlecode.com/svn/trunk/danish_regional_data.json 如何删除所有邮政编码的within_5_kmwithin_10_kmwithin_25_kmwithin_50_kmwithin_100_km属性?
我已经阅读了这个问题:删除JSON属性
$(document).ready(function() {

    $.getJSON("post.json", function(data) {

    var pc = data.postalcodes;
    for (var id in pc) {
       if(pc.hasOwnProperty(id)) {
          for(var attr in pc[id]) {
             if(pc[id].hasOwnProperty(attr) && attr.indexOf('within_') === 0) {
               delete pc[id][attr];
             }
          }
       }
    }

    $("#json").html(pc);

    });

});

1
你需要递归循环遍历JSON对象,查找这些属性,并在找到时删除它们,就像你链接的问题中的答案所示。 - Matthemattics
5
警告:问题中有一个12MB的.json文件。 - andyb
如果您想在JSON调用后执行此操作以获取数据,那么这将是多余的,因为您必须首先下载它们才能删除它们。 - Rory McCrossan
@Lübnah - 你能展示一下如何做到这一点吗?因为在链接的问题中没有循环或搜索 :/ - Rails beginner
@Lübnah,实际上并没有所谓的JSON对象。JSON被用作指定类型的对象的表示形式。 - jwaliszko
1
@JaroslawWaliszko 好的,这有点迂腐,但从技术角度来说是正确的。JSON == JavaScript对象表示法。所以,我/想表达的是OP在JSON中表达的对象。现在开心了吗? - Matthemattics
5个回答

3
在ES2016中,您可以使用解构来选择子集对象所需的字段。
//ES6 subset of an object by specific fields
var object_private = {name: "alex", age: 25, password: 123};
var {name,age} = object_private, object_public = {name,age}


//method 2 using literals
let object_public = (({name,age})=>({name,age}))(object_private);


//use map if array of objects
    users_array.map(u=>u.id)

删减一部分代码通常并不会很有帮助。您能否解释一下为什么这样做是可以的? - Mike Cluck

2

请打开您提供的JSON网址并打开Firebug控制台。然后将以下代码复制并粘贴到控制台中并执行:

var p = document.getElementsByTagName('pre');
for(i=0; i < p.length; i++) {

  var data = JSON.parse(p[i].innerHTML);
  var pc = data.postalcodes;

  // this is the code i gave you... the previous is jsut to pull it out of the page
  // in Firebug - this works for me

  for (var id in pc) {
     if(pc.hasOwnProperty(id)) {
        for(var attr in pc[id]) {
          if(pc[id].hasOwnProperty(attr) && attr.indexOf('within_') === 0) {
             console.log('Deleting postalcodes.'+id+'.'+attr);
             delete pc[id][attr];
           }
        }
     }
  }
}

// assume data is the complete json

var pc = data.postalcodes;
for (var id in pc) {
   if(pc.hasOwnProperty(id)) {
      for(var attr in pc[id]) {
         if(pc[id].hasOwnProperty(attr) && attr.indexOf('within_') === 0) {
           delete pc[id][attr];
         }
      }
   }
}

当然,这是在 OP 将 JSON 字符串转换为实际对象之后。 - Matthemattics
绝对不需要使用 hasOwnProperty - Bergi
@Lübnah:我假设他已经成功解析了JSON字符串。问题并没有问如何将JSON字符串转换为JS对象,而是关于嵌套迭代的。 - prodigitalson
尝试使用$("#json").text(JSON.stringify(data));代替。 - Bergi
@Bergi:没错...这是习惯使然(关于hasOwnProperty)。 - prodigitalson
显示剩余5条评论

1

JSON 被截断:

var data = {"postalcodes":
{"800":{"id":"800","name":"H\u00f8je Taastrup","region_ids":["1084"],"region_names":["Hovedstaden"],"commune_ids":["169"],"commune_names":["H\u00f8je-Taastrup"],"lat":"55.66713","lng":"12.27888", "within_5_km":["800","2620","2630","2633"],"within_10_km":["800","2600","2605","2620"]},
"900":{"id":"900","name":"K\u00f8benhavn C","region_ids":["1084"],"region_names":["Hovedstaden"],"commune_ids":["101"],"commune_names":["K\u00f8benhavns"],"lat":"55.68258093401054","lng":"12.603657245635986","within_5_km":["900","999"]},
"1417":{"commune_id":"390","region_id":"1085"}}};
var pc = data.postalcodes;
for (var id in pc) {
    var entry = pc[id];
    for(var attr in entry) {
        if(attr.indexOf('within_') === 0) {
            delete entry[attr];
        }
    }
}
console.dir(data); // your data object has been augmented at this point

您也可以使用正则表达式

var data = {"postalcodes":
{"800":{"id":"800","name":"H\u00f8je Taastrup","region_ids":["1084"],"region_names":["Hovedstaden"],"commune_ids":["169"],"commune_names":["H\u00f8je-Taastrup"],"lat":"55.66713","lng":"12.27888", "within_5_km":["800","2620","2630","2633"],"within_10_km":["800","2600","2605","2620"]},
"900":{"id":"900","name":"K\u00f8benhavn C","region_ids":["1084"],"region_names":["Hovedstaden"],"commune_ids":["101"],"commune_names":["K\u00f8benhavns"],"lat":"55.68258093401054","lng":"12.603657245635986","within_5_km":["900","999"]},
"1417":{"commune_id":"390","region_id":"1085"}}};
var regexp = new RegExp("^within_", "i");   // case insensitive regex matching strings starting with within_
var pc = data.postalcodes;
for (var id in pc) {
    var entry = pc[id];
    for(var attr in entry) {
        if(regexp.test(attr)) {
            delete entry[attr];
        }
    }
}
console.dir(data);

1
我已经编写了一个npm模块unset,它可以完美地实现这一功能。您可以指定类似于json-path模块的json路径,直到您想要删除的叶属性。
let unset = require('unset');
let object = {a: { b: [ {x: 1}, {x: [{ e: 2} ]}]}};
let newObject = unset(object, ['/a/b[*]/x']);

第二个参数支持多个路径。

0

好的,你可以这样做:

var postalcodes = YOUR JSON;

for(var code in postalcodes)
{
 delete postalcodes[code].within_5_km;
 .
 .
 .
}

你可能想要检查代码中是否包含你的属性...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接