如果存在,则从具有唯一值的对象数组中过滤唯一属性,然后覆盖该值

时间:2017-08-15 07:28:50

标签: javascript jquery arrays filter

我正在尝试迭代具有不同属性的对象数组。我在哪里动态添加对象,并想检查对象的属性是否存在于数组中,然后只覆盖该值,否则将其添加到数组中。

对于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次。

有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:3)

尝试使用此Array.reduce()函数和Object.keys()方法。

  1. array#reduce()用于使用新数组重新创建
  2. Object.keys()获取每个对象的密钥。Array#map()创建所有对象键的数组。
  3. 然后在数组中匹配includes,然后使用新数组推送
  4. 已更新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);