JS / Lodash - 不止一次出现的组值?

时间:2017-06-06 16:01:13

标签: javascript lodash

我有一个类似的数组:

const arr = [
  { id: 123, parent: [345] },
  { id: 811, parent: [456] },
  { id: 987, parent: [876] },
  { id: 811, parent: [137] },
  { id: 811, parent: [825] }
]

标识为811的对象出现3次。

我需要将其转换为:

const newArr = [
  { id: 123, parent: [345] },
  { id: 811, parent: [456, 137, 825] },
  { id: 987, parent: [876] }
]

也就是说,我需要找到具有多次出现的id的对象,然后将这些对象合并到一个对象中,该对象具有来自所有对象的父值的父数组。

使用lodash方法做到这一点的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

使用lodash,groupBy id,合并每个组,并连接数组:

const arr = [{"id":123,"parent":[345]},{"id":811,"parent":[456]},{"id":987,"parent":[876]},{"id":811,"parent":[137]},{"id":811,"parent":[825]}];

const result = _(arr)
  .groupBy('id')
  .map((group) => _.mergeWith({}, ...group, (o1, o2) => 
    Array.isArray(o1) ? o1.concat(o2) : undefined
  ))
  .value();
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

或者使用ES6,您可以使用Array#reduceMap执行相同操作:

const arr = [{"id":123,"parent":[345]},{"id":811,"parent":[456]},{"id":987,"parent":[876]},{"id":811,"parent":[137]},{"id":811,"parent":[825]}];

const result = [...arr.reduce((map, obj) => {
  const group = map.get(obj.id) || { id: obj.id, parent: [] };
  
  group.parent.push(...obj.parent);
  
  return map.set(obj.id, group);
}, new Map()).values()];

console.log(result);

答案 1 :(得分:0)

您可以在普通js中使用reduce()方法来执行此操作,您只需要跟踪对象ID,并且可以使用另一个对象。

const arr = [
  { id: 123, parent: [345] },
  { id: 811, parent: [456] },
  { id: 987, parent: [876] },
  { id: 811, parent: [137] },
  { id: 811, parent: [825] }
]

var o = {}
var result = arr.reduce(function(r, e) {
  if(!o[e.id]) o[e.id] = e, r.push(o[e.id])
  else o[e.id].parent.push(...e.parent)
  return r;
}, [])

console.log(result)