如何在JavaScript对象中删除具有相同键的所有元素

时间:2015-03-16 17:20:14

标签: javascript object

我正在使用像这样的JavaScript对象中的JSON数据:

var data = [
{ "City" : "New York",    "State" : "New York"     },
{ "City" : "Fargo",       "State" : "North Dakota" },
{ "City" : "Los Angeles", "State" : "California"   }
];

我想删除状态数据,所以它最终会这样:

var data = [
{ "City" : "New York"},
{ "City" : "Fargo"},
{ "City" : "Los Angeles"}
];

目前我正在循环并删除它,但有没有办法从对象中删除城市而无需循环?

我找到了"删除"运算符("删除运算符从对象中删除属性。")但似乎仅在只有一个具有该属性的项目时才起作用,而不是像示例对象中那样全局。

delete object["State"] //doesn't work

编辑:我的坏。我复制/粘贴和编辑不正确。我已将原来的帖子更改为使用Polywhirl先生的答案中提供的正确格式。

编辑:我最终使用了mccainz建议的map方法。使用map允许将所有特定键/值对(如城市)从一个数组拉到另一个数组。你也可以拉多个像

newData = data
.map(function(v){
return {City:v.City, State:v.State}; 
});

它可以用于我的目的并且更好,因为我保留了少数键/值对。但是,似乎没有任何解决方案可以在原始问题中执行任务。例如,如果每个数组项有100个不同的键/值对,则必须将99添加到新数组中,而不是只从现有数组中删除一个。

3 个答案:

答案 0 :(得分:1)

您应该将数据转换为对象数组,并简单地对数组进行操作。下面的示例使用array.map返回缺少State属性的数组。然而,有很多方法可以给这只猫皮肤。

(编辑以演示地图前的过滤预处理)

var data=[];

data.push({"City":"New York","State":"New York"});
data.push({"City":"Fargo","State":"North Dakota"});
data.push({"City":"Los Angeles","State":"California"});

var newData;

newData = data
  .filter(function(v){
    return v.State !=='California';
  })
  .map(function(v){
    return {City:v.City};
  });

Array.prototype.filter
Array.prototype.map

正如其他人所指出的那样,您的JSON对象中不能有重复的属性。您的数据应该在数组中,而不是在一个怪物对象中。

答案 1 :(得分:1)

如果您不想修改原始对象,可以将map和reduce结合使用以创建过滤后的对象。

var data = [
    { "City" : "New York",    "State" : "New York"     },
    { "City" : "Fargo",       "State" : "North Dakota" },
    { "City" : "Los Angeles", "State" : "California"   }
];

var filterKeys = function(data, keysToFilter) {
  return data.map(function(item) {
    return Object.keys(item).reduce(function(result, key) {
      if (keysToFilter.indexOf(key) === -1) result[key] = item[key];
      return result;
    }, {});
  });
}

document.body.innerHTML = JSON.stringify(filterKeys(data, ['State']), null, '  ');
body {
  font-family: monospace;
  white-space: pre;
}

结果

[
  { "City": "New York" },
  { "City": "Fargo" },
  { "City": "Los Angeles" }
]

答案 2 :(得分:0)

您无法启动具有两个相同keys的对象,例如

var obj={city:"NEW YORK",city:"NEW JERSEY"}

city属性将保留NEW JERSEY。因为它已被覆盖。

JSON.stringify(obj); // {"city":"NEW JERSEY"}

如果您使用json.your obj1启动对象,则只会保留一个citystate属性。

   JSON.stringify(obj1); //{"City":"Fargo","State":"North Dakota"}