【问题标题】:Compare two objects in JavaScript比较 JavaScript 中的两个对象
【发布时间】:2018-09-12 11:36:58
【问题描述】:

我构造了如下对象:

对象 1

[ { 
   ext: '1287',
   ip: '(Unspecified)',
   queue: [ ]
 } ]

对象 2

 [ { Queue: '222',
    Members:
     [ {"ext":"1287"},
       {"ext":"4118"} ],
    Callers: [] },

  { Queue: '111',
    Members:
     [ {"ext":"4131"},
       {"ext":"1287"},
       {"ext":"4138"}
     ],
    Callers: [] }]

我想比较对象 1 和对象 2。如果对象 1 的 ext 键的值存在于对象 2 的嵌套成员对象中,那么 Queue 的值应该被推送到队列数组中,最终的对象应该如下所示。

我想要的最终对象

   [{ ext: '1287',
   ip: '(Unspecified)',
   queue: [222, 111 ] }]

我需要一些关于如何使用 lodash 比较像这样的嵌套对象的提示。

【问题讨论】:

  • '{"ext":"4131"}' 是问题中的字符串。是笔误吗?
  • a) 没有像 JSON 对象 这样的东西。 b)您显示数组,而不是对象。 c) 您的 JSON 无效,属性名称 b 必须在 JSON 中引用。
  • '{"ext":"4131"}', '{"ext":"1287"}', '{"ext":"4138"}' 对象 2 是成员数组字符串或每个都表现为一个单独的对象

标签: javascript node.js lodash


【解决方案1】:

您可以尝试使用Array.forEachArray.some 关注

let obj1 = [{ext: '1287',ip: '(Unspecified)',queue: []}];
let obj2 = [{Queue: '222',Members: [{"ext":"1287"},{"ext":"4118"}],Callers: []},{Queue: '111',Members: [{"ext":"4131"},{"ext":"1287"},{"ext":"4138"}],Callers: []}];

obj1.forEach(o => {
  obj2.forEach(v => {
    let exists = v.Members.some(m => m.ext === o.ext);
    if (exists) o.queue.push(v.Queue);
  });
});

console.log(obj1);

改进

您可以通过首先创建obj1mapext 作为keyobject 作为value 来提高性能。使用Array.reduceObject.assign

let obj1 = [{ext: '1287',ip: '(Unspecified)',queue: []}];
let obj2 = [{Queue: '222',Members: [{"ext":"1287"},{"ext":"4118"}],Callers: []},{Queue: '111',Members: [{"ext":"4131"},{"ext":"1287"},{"ext":"4138"}],Callers: []}];

let map = obj1.reduce((a, c) => Object.assign(a, {[c.ext] : c}), new Map());

obj2.forEach(v => {
  v.Members.forEach(m => {
    if(map[m.ext]) map[m.ext].queue.push(v.Queue);
  });
});

console.log(obj1);

【讨论】:

  • 谢谢,尼基尔。这个解决方案是完美的。另外,我更正了我的问题
  • @NAVLEPRAVIN - 很高兴为您提供帮助!
【解决方案2】:

没有突变的解决方案:

const obj1 = [{ext: '1287',ip: '(Unspecified)',queue: []}];
const obj2 = [{Queue: '222',Members: [{"ext":"1287"},{"ext":"4118"}],Callers: []},{Queue: '111',Members: [{"ext":"4131"},{"ext":"1287"},{"ext":"4138"}],Callers: []}];

const hasExt = ext => o2 => o2.Members.some(m => m.ext === ext)

const result = obj1.map(o1 => {
  const newQueue = obj2
    .filter(hasExt(o1.ext))
    .map(m => m.Queue);
    
  return { ...o1, queue: [...o1.queue, ...newQueue] };
})

console.log(result);

【讨论】:

  • 嘿,这个解决方案也很有帮助。谢谢
  • 嘿,如果我想要这样的数组,我该怎么做 [ { "ext": "1287", "ip": "(Unspecified)", "queue": [ {"number" : "222"}, {"number" : "111"} ] } ]
  • @pravinnavle 将 .map(m => m.Queue) 更改为 .map(m => ({number: m.Queue}))
  • 非常感谢,它成功了。抱歉,我正在接受越来越多的帮助。
  • @pravinnavle .map(m => ({number: m.Queue, name: m.Members.find(m => m.ext === o1.ext).name})) Web 平台的最佳资源是 developer.mozilla.org。如果你想深入了解 js -> github.com/getify/You-Dont-Know-JS。或视频frontendmasters.com(本周所有课程均可免费观看)
猜你喜欢
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多