组连续的相似元素数组

时间:2019-07-12 08:04:19

标签: 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);
    }
}, []);

2 个答案:

答案 0 :(得分:2)

您实际上很亲密:

 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

请注意,虽然将数字存储为字符串几乎没有意义。

答案 1 :(得分:1)

您可以reduce这样的数组。将当前name与上一项的名称进行比较。如果它们不同,则向累加器中添加一个新项目。如果它们相同,则将val与合并的concat与累加器中的最后一项一起使用。之所以使用vals是因为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' } ] const merged = array.reduce((acc, { name, val }, i, arr) => { // check if name is same as the previous name if (arr[i - 1] && arr[i - 1].name === name) { const prev = acc[acc.length - 1]; // last item in the accumulator prev.vals = [].concat(prev.vals, val) } else acc.push({ name, vals: val }) return acc }, []) console.log(merged)可以是字符串或数组。

asort($mergeArr);