我正在尝试迭代具有不同属性的对象数组。我在哪里动态添加对象,并想检查对象的属性是否存在于数组中,然后只覆盖该值,否则将其添加到数组中。
对于e.x.
var arr = [
{"value":"abc"},
{"type":"def"},
{"status":"ghi"},
{"value":"xyz"}
]
预期结果:
arr = [
{"value":"xyz"},
{"type":"def"},
{"status":"ghi"}
到目前为止,我所尝试的并不奏效。这是我的代码:
var arr = [
{"value":"abc"},
{"type":"def"},
{"status":"ghi"},
{"value":"abc"}
]
var obj={};
var key1 = "type", value="xyz";
obj[key1] = value;
var newarr = arr.filter(function(entry,i) {
if (!entry.hasOwnProperty(key1)) {
return true;
}
});
newarr.push(obj);
请注意,obj将是动态的,因此当key1的属性没有改变时,我的代码第一次正常工作。一旦我从&#34更改了key1的值;输入"到" status",它正在添加对象2次。
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
尝试使用此Array.reduce()
函数和Object.keys()
方法。
array#reduce()
用于使用新数组重新创建Object.keys()
获取每个对象的密钥。Array#map()
创建所有对象键的数组。includes
,然后使用新数组推送 已更新将type
替换为新value
var arr = [{"value":"abc"}, {"type":"def"}, {"status":"ghi"}, {"value":"xyz"}];
var key1 = "type";
var value="xyz";
var result = arr.reduce((a,b) =>{
if(!a.map(i=> Object.keys(i)[0]).includes(Object.keys(b)[0]))
{
if(b.hasOwnProperty(key1)){
b[key1]=value
}
a.push(b)
}
return a}, []);
console.log(result);

答案 1 :(得分:0)
您可以使用哈希表并过滤并更新所有找到的相同密钥对象。
.as-console-wrapper { max-height: 100% !important; top: 0; }
\W
答案 2 :(得分:0)
使用ES6 Array.prototype.reduce()
和Object.assign()
函数的解决方案:
var arr = [{"value":"abc"}, {"type":"def"}, {"status":"ghi"}, {"value":"xyz"}],
obj = arr.reduce((r,o) => Object.assign(r,o), {}),
result = Object.keys(obj).map( (k) => { o = {}; o[k]=obj[k]; return o } );
console.log(result);
答案 3 :(得分:0)
以下代码应该完成这项工作:
var arr = [
{"value":"abc"},
{"type":"def"},
{"status":"ghi"},
{"value":"xyz"}
];
var obj = {};
for (i in arr) {
key = Object.keys(arr[i])[0];
obj[key] = arr[i][key];
}
console.log(obj);