繁体   English   中英

比较两个对象数组

[英]compare two arrays of objects

我有两个这样的数组。 第一个数组是customFields ,长度是 2

var customFields = [  
   {  
      "$$hashKey":"object:259",
      "fields":[  

      ],
      "id":0.84177744416334,
      "inputType":"number",
      "labelShown":"item",
      "type":"textBox",
      "value":"222222"
   },
   {  
      "$$hashKey":"object:260",
      "fields":[  
         "as",
         "dd",
         "asd"
      ],
      "id":0.51091342118417,
      "inputType":"",
      "labelShown":"labels",
      "type":"selectBox",
      "value":"dd"
   }
]

第二个是field ,长度为 3

var field = [  
   {  
      "fields":[  

      ],
      "id":0.84177744416334,
      "inputType":"number",
      "labelShown":"item",
      "type":"textBox"
   },
   {  
      "fields":[  
         "as",
         "dd",
         "asd"
      ],
      "id":0.51091342118417,
      "inputType":"",
      "labelShown":"labels",
      "type":"selectBox"
   },
   {  
      "fields":[  

      ],
      "id":0.32625015743856,
      "inputType":"text",
      "labelShown":"sample",
      "type":"textBox"
   }
] 

两个数组都是动态的,我需要按id字段比较这些数组,并将缺少的对象从field数组添加到customFields数组。 如果没有 2 个 for 循环在另一个内部循环,我怎么能做到这一点。 什么是最有效的方法。 谢谢你 !!!!

您可以使用reduce()find()来获得所需的结果。

 var customFields = [{"$$hashKey":"object:259","fields":[],"id":0.84177744416334,"inputType":"number","labelShown":"item","type":"textBox","value":"222222"},{"$$hashKey":"object:260","fields":["as","dd","asd"],"id":0.51091342118417,"inputType":"","labelShown":"labels","type":"selectBox","value":"dd"}]; var field = [{"fields":[],"id":0.84177744416334,"inputType":"number","labelShown":"item","type":"textBox"},{"fields":["as","dd","asd"],"id":0.51091342118417,"inputType":"","labelShown":"labels","type":"selectBox"},{"fields":[],"id":0.32625015743856,"inputType":"text","labelShown":"sample","type":"textBox"}] var result = field.reduce(function(r, e) { var f = customFields.find(el => e.id == el.id) r.push(f ? f : e) return r; }, []) console.log(result)

您可以使用原生高阶函数,例如 map 和 reduce。

使用 lodash 的示例实现在这里。 https://github.com/rbs392/object-deep-diff/blob/master/index.js

这是一个没有嵌套循环的解决方案。 首先生成一个查找表,其中包含customFields数组的 ID。 接下来遍历field数组,并将每个缺少的对象附加到customFields数组。 查找表也会更新以处理可能的重复项。

var lut = customFields.map(function(obj) {
  return obj.id;
});
field.forEach(function(obj) {
  if (lut.indexOf(obj.id) == -1) {
    customFields.push(obj);
    lut.push(obj.id);
  }
});

正如评论中所指出的,我的第一个命题隐藏了indexOf复杂性。

这是一种依赖于对象属性进行 ID 查找的替代方法,这可能比线性搜索更好。 lut维护从 ID 到customFields数组索引的关联。

var lut = customFields.reduce(function(t, obj, i) {
  t[obj.id] = i;
  return t;
}, {});
field.forEach(function(obj) {
  if (undefined === lut[obj.id]) {
    lut[obj.id] = customFields.push(obj) - 1;
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM