Javascript 如何删除嵌套属性?

Javascript 如何删除嵌套属性?,javascript,jquery,Javascript,Jquery,我有这个JSON文件: 如何删除所有邮政编码的5公里以内、10公里以内、25公里以内、50公里以内、100公里以内 我看过这个问题: 你可以这样做: var postalcodes = YOUR JSON; for(var code in postalcodes) { delete postalcodes[code].within_5_km; . . . } 您可能需要检查代码是否包含您的属性…转到您提供的json url并打开Firebug控制台。然后输入以下代码并执行: var

我有这个JSON文件:

如何删除所有邮政编码的5公里以内
、10公里以内
、25公里以内
、50公里以内
、100公里以内

我看过这个问题:

你可以这样做:

var postalcodes = YOUR JSON;

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

您可能需要检查代码是否包含您的属性…

转到您提供的json url并打开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];
           }
        }
     }
  }
}
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);
在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)

我已经写了一个npm模块,它正是这样做的。指定与模块类似的json路径,直到要删除的叶属性

let unset = require('unset');
let object = {a: { b: [ {x: 1}, {x: [{ e: 2} ]}]}};
let newObject = unset(object, ['/a/b[*]/x']);

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

那么,您需要递归地在JSON对象上循环,搜索这些属性,并在找到它们时删除它们,根据您链接问题中的答案。问题中的警告12MB
.json
文件如果您希望在json调用后执行此操作以获取数据,那么这将是多余的,因为您必须先下载所有文件才能删除它们。@Lübnah-您可以演示如何执行此操作吗?因为在链接的问题中没有循环或搜索:/@JaroslawWaliszko好吧,这有点迂腐,但是的,这在技术上是正确的。JSON==JavaScript对象表示法。因此,我的意思是OP用JSON表示的对象。现在高兴吗?当然,这是在OP将JSON字符串转换为实际对象之后,我尝试了您的解决方案,但它不起作用。我已经用我的代码更新了我的问题。绝对不需要
hasOwnProperty
@Lübnah:我想他已经很擅长解析了。问题并不是问如何将json字符串转换为js对象,而是关于嵌套迭代。@Railsbeginner:Try
$(“#json”).text(json.stringify(data))而不是删除一段代码通常没有多大帮助。你能解释一下为什么这会起作用吗?
//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)
let unset = require('unset');
let object = {a: { b: [ {x: 1}, {x: [{ e: 2} ]}]}};
let newObject = unset(object, ['/a/b[*]/x']);