Javascript 如何过滤数组中的重复元素而不使用lodash删除它们?

Javascript 如何过滤数组中的重复元素而不使用lodash删除它们?,javascript,lodash,Javascript,Lodash,我想知道如何过滤数组中的重复对象,但不删除重复项,而是将它们存储在返回元素中的数组中。我不确定我所说的是否可以理解,因此举个例子会很有用: 我的数据: 我期望得到的: [{ letter: 'a', numbers: [{number: 1}, {number: 2}, {number: 3}, {number: 4}], }, { letter: 'b', numbers: [{number: 1}, {number: 2}],

我想知道如何过滤数组中的重复对象,但不删除重复项,而是将它们存储在返回元素中的数组中。我不确定我所说的是否可以理解,因此举个例子会很有用: 我的数据:

我期望得到的:

[{
      letter: 'a',
      numbers: [{number: 1}, {number: 2}, {number: 3}, {number: 4}],
    }, {
      letter: 'b',
      numbers: [{number: 1}, {number: 2}],
    }]

我知道我们在寻找答案,但是一个解释会很好。

您可以使用
数组。reduce
方法

arr.reduce((acc, {letter,number}) => { 
                                       let obj = acc.find(a => a.letter === letter);                                                                               
                                         obj 
                                         ? obj.numbers.push({number}) 
                                         : acc.push({ letter,numbers:[{number}]}); 

                                         return acc; 
                                       }
           , [])

按字母
分组,然后将组映射到对象。通过映射值并省略
字母来创建数字:

const{map,groupBy,omit}=_
const arr=[{字母:a',数字:1},{字母:a',数字:2},{字母:a',数字:3},{字母:b',数字:1},{字母:b',数字:2},{字母:a',数字:4},{字母:b',数字:1},{字母:a',数字:3}]
常量结果=映射(
groupBy(arr,'字母'),
(数字、字母)=>({
信
数字:映射(数字,o=>省略(o,‘字母’),
})
)
console.log(结果)

一种更合理的预期输出格式将使这一点更容易实现。为什么不仅仅是:
{a:[1,2,3,4],b:[1,2]}
?这几乎不需要lodash。我简化了我的问题,我的对象要大得多,但有一个例子就足够了。
arr.reduce((acc, {letter,number}) => { 
                                       let obj = acc.find(a => a.letter === letter);                                                                               
                                         obj 
                                         ? obj.numbers.push({number}) 
                                         : acc.push({ letter,numbers:[{number}]}); 

                                         return acc; 
                                       }
           , [])