javascript - 对连续的相似元素数组进行分组

标签 javascript arrays reduce

这是我的简单对象数组

const array = [
    { name: 'a', val: '1234' },
    { name: 'b', val: '5678' },
    { name: 'c', val: '91011' },
    { name: 'c', val: '123536' },
    { name: 'e', val: '5248478' },
    { name: 'c', val: '5455' },
    { name: 'a', val: '548566' },
    { name: 'a', val: '54555' }
]

我需要对连续的名称元素进行分组并推送相应的val。所以预期的输出应该是

const array = [
    { name: 'a', vals: '1234' },
    { name: 'b', vals: '5678' },
    { name: 'c', vals: ['91011', '123536'] },
    { name: 'e', vals: '5248478' },
    { name: 'c', vals: '5455' },
    { name: 'a', vals: ['548566', '54555'] }
]

我尝试过,但无法克服它。请帮忙

const output = []
const result = array.reduce((a, c) => {
    if (a.name === c.name) {
        output.push(a);
    }
}, []);

最佳答案

你实际上已经很接近了:

 const output = [];
 array.reduce((a, c) => {
    if (a.name === c.name) { // current element equals previous element, lets merge
       a.values.push(c.val);
    } else output.push(a = { name: c.name, values: [c.val] ); // otherwise add new entry
    return a; // the current element is the next previous
  }  , {}); // start with an empty a, so that c always gets pushed

请注意,将数字存储为字符串没有什么意义。

关于javascript - 对连续的相似元素数组进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57002705/

相关文章:

javascript - 全局数组值丢失函数范围外的数据

javascript - 在 BiDi 实现中,阿拉伯字符在渲染过程中移动到不同的位置

java - 从 ArrayList 中删除一个对象

javascript - 获取 Map 对象的最后一个键

jquery数组分组依据

perl - 获得Perl数组的最后N个元素的最佳方法是什么?

java - 使用 Java Streams 按属性将对象列表组合在一起,并将它们缩减为具有另一个属性平均值的新对象列表

c# - 调用 System.Drawing.Image.Save 时出现无效参数错误

typescript - 为什么 TypeScript 在使用 concat 缩减数组时会推断出 'never' 类型?

javascript - 为 javascript、jQuery 中的异步函数链参数化变量回调