【问题标题】:filter unique properties from array of objects with unique values if existing then override the value从具有唯一值的对象数组中过滤唯一属性(如果存在)然后覆盖该值
【发布时间】:2017-08-15 07:28:49
【问题描述】:

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

例如

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 的属性没有改变时,我的代码第一次可以正常工作。一旦我将 key1 的值从“类型”更改为“状态”,它就会添加对象 2 次。

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

【问题讨论】:

  • type 如何变异为data-type?还是两者不同?
  • 错字已更正!!
  • 两个value 键和一个更新会发生什么?
  • 具有值的唯一属性应该只存在。
  • 请更改示例。

标签: javascript jquery arrays filter


【解决方案1】:

试试这个Array.reduce() 函数和Object.keys() 方法。

  1. array#reduce() 用于重新创建新数组
  2. Object.keys() 获取每个对象的键。Array#map() 创建所有对象键的数组。
  3. 如果不是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);

【讨论】:

  • 感谢先生的回答。我们可以只使用过滤器吗?
  • 过滤器不做同样的工作...reduce() 有什么问题?
  • reduce 没有问题,只是想知道我们可以通过 filter/shortest 方式实现相同目标的区别,这似乎是通过 reduce。
  • 过滤器仅针对返回数组的简单条件执行。它不允许在其中执行任何其他数组函数。这就是为什么要移至array#reduce .Array#reduce 用于更多复杂条件的数量跨度>
  • 谢谢。我将不得不阅读文档。为减少。谢谢你的解释!!
【解决方案2】:

以下代码应该可以完成这项工作:

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);

【讨论】:

    【解决方案3】:

    使用 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);

    【讨论】:

    • @DipeshRaichana,对于对象数组 - 固定,对于旧值 - 不正确,它按预期提供更新的值。检查我的更新
    • 我得到了答案。无论如何..感谢您的回答!
    【解决方案4】:

    您可以使用哈希表并过滤和更新所有找到的相同关键对象。

    var array = [{ value: "abc" }, { type: "def" }, { status: "ghi" }, { value: "ddd" }],
        key = "type",
        value = "xyz",
        update = false,
        hash = Object.create(null),
        temp = {};
    
    temp[key] = value;
    
    array.push(temp);
    array = array.filter(function (o) {
        var key = Object.keys(o)[0];
        if (!hash[key]) {
            hash[key] = o;
            return true;
        }
        hash[key][key] = o[key];
    });
    
    console.log(array);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 2017-09-08
      • 2012-09-12
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多