通过唯一属性和数组

时间:2018-03-07 18:18:29

标签: javascript arrays underscore.js lodash

我发现很难找到Lodash和Underscore的多级推/合并解决方案。试图用JS避免一些混乱的嵌套循环。

以下是我需要合并的示例。

const arr = [
  {
    level : 'test',
    items : [1, 2, 3]
  },
  {
    level : 'tests',
    items : [1, 2, 3]
  }
];

const obj = {
  level : 'test',
  items : [4, 5, 6]
};


/* Output:
  [
    {
      level : 'test',
      items : [1, 2, 3, 4, 5, 6]
    },
    {
      level : 'tests',
      items : [1, 2, 3]
    }
  ];
*/

obj级别匹配arr[0],因此items数组应合并。新的或唯一的级别应该作为新对象推送到数组。

有没有办法通过Lodash _.groupBy_.mergeWith的某种组合实现这一目标?到目前为止,我已经将它合并为一个包含两个相应唯一级别的两个对象的数组,但是当项目数组合并时,它最终会得到[4, 5, 6]

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用array#find搜索具有相同level值的对象。然后,成功匹配array#concat个项目。

const arr = [ { level : 'test', items : [1, 2, 3] }, { level : 'tests', items : [1, 2, 3] } ]; 
const obj = { level : 'test', items : [4, 5, 6] };
const result = arr.find(o => o.level === obj.level);
if(result)
  result.items = result.items.concat(obj.items);
console.log(arr);

答案 1 :(得分:1)

const arr = [
  {
    level : 'test',
    items : [1, 2, 3]
  },
  {
    level : 'tests',
    items : [1, 2, 3]
  }
];

const obj = {
  level : 'test',
  items : [4, 5, 6]
};


/* Output:
  [
    {
      level : 'test',
      items : [1, 2, 3, 4, 5, 6]
    },
    {
      level : 'tests',
      items : [1, 2, 3]
    }
  ];
*/

const newArr = _.map(arr, (val) => {
  return !_.isEqual(val.level, obj.level) ? val 
    : _.assign({}, val, {
      items: _.concat(val.items, obj.items)
    });
});

console.log(newArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

答案 2 :(得分:1)

arr.map((e)=>{e.level === obj.level && e.items.push(...obj.items);return e})

让我知道它是否有效