我发现很难找到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]
。
任何帮助都将不胜感激。
答案 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})
让我知道它是否有效