如何删除 JavaScript 对象中具有相同键的所有元素
How to remove all elements with the same key in 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" 运算符 ("The delete operator removes a property from an object."),但它似乎只有在只有一个项目带有 属性 时才有效,而不是像示例对象中那样全局。
delete object["State"] //doesn't work
编辑:我的错。我 copy/pasted 并且编辑不正确。我已更改原始 post 以使用 Polywhirl 先生的回答中提供的正确格式。
编辑:我最终使用了 mccainz 建议的 map 方法。使用 map 允许将某个 key/value 对(如城市)的所有内容从一个数组拉到另一个数组。您也可以像
一样拉取多个
newData = data
.map(function(v){
return {City:v.City, State:v.State};
});
它对我的目的有用,而且更好,因为我保留了 key/value 对中的少数。但是,似乎没有任何解决方案可以执行原始问题中的任务。例如,如果每个数组项有 100 个不同的 key/value 对,则必须将 99 添加到新数组,而不能只从现有数组中删除一个。
您应该将数据转换为一个对象数组,然后简单地对该数组进行操作。下面的示例使用 array.map 到 return 一个没有状态属性的数组。然而,有很多方法可以给这只猫剥皮。
(编辑以演示映射前的过滤预处理)
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 对象中不能有重复的属性。您的数据应该在一个数组中,而不是在一个怪物对象中。
您不能用两个相同的 keys
启动一个对象。例如
var obj={city:"NEW YORK",city:"NEW JERSEY"}
city
属性 将保持 NEW JERSEY
。因为它被覆盖了。
JSON.stringify(obj); // {"city":"NEW JERSEY"}
如果您使用 json.your 启动一个对象,obj1 将只包含一个 city
和 state
属性.
JSON.stringify(obj1); //{"City":"Fargo","State":"North Dakota"}
如果不想修改原始对象,可以结合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" }
]
我正在使用 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" 运算符 ("The delete operator removes a property from an object."),但它似乎只有在只有一个项目带有 属性 时才有效,而不是像示例对象中那样全局。
delete object["State"] //doesn't work
编辑:我的错。我 copy/pasted 并且编辑不正确。我已更改原始 post 以使用 Polywhirl 先生的回答中提供的正确格式。
编辑:我最终使用了 mccainz 建议的 map 方法。使用 map 允许将某个 key/value 对(如城市)的所有内容从一个数组拉到另一个数组。您也可以像
一样拉取多个newData = data
.map(function(v){
return {City:v.City, State:v.State};
});
它对我的目的有用,而且更好,因为我保留了 key/value 对中的少数。但是,似乎没有任何解决方案可以执行原始问题中的任务。例如,如果每个数组项有 100 个不同的 key/value 对,则必须将 99 添加到新数组,而不能只从现有数组中删除一个。
您应该将数据转换为一个对象数组,然后简单地对该数组进行操作。下面的示例使用 array.map 到 return 一个没有状态属性的数组。然而,有很多方法可以给这只猫剥皮。
(编辑以演示映射前的过滤预处理)
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 对象中不能有重复的属性。您的数据应该在一个数组中,而不是在一个怪物对象中。
您不能用两个相同的 keys
启动一个对象。例如
var obj={city:"NEW YORK",city:"NEW JERSEY"}
city
属性 将保持 NEW JERSEY
。因为它被覆盖了。
JSON.stringify(obj); // {"city":"NEW JERSEY"}
如果您使用 json.your 启动一个对象,obj1 将只包含一个 city
和 state
属性.
JSON.stringify(obj1); //{"City":"Fargo","State":"North Dakota"}
如果不想修改原始对象,可以结合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" }
]