繁体   English   中英

在 JavaScriot 中按特定键值对数组中的项进行分组

[英]Group items in an array by a specific key value in JavaScriot

下面是我的 Json 对象。

[{section: 'group_date', category: 'Support', category_value: '2021-10-11', datavalue: '2'}
{section: 'group_date', category: 'Support', category_value: '2021-10-20', datavalue: '3'}
{section: 'group_date', category: 'Support', category_value: '2021-11-02', datavalue: '1'}
{section: 'group_date', category: 'Dev', category_value: '2021-11-02', datavalue: '1'}
{section: 'group_date', category: 'Dev', category_value: '2021-11-03', datavalue: '1'}]

我正在尝试创建一个新数组,如下所示。

 [
{category:'Support', value:[
        ['2021-10-11','2'],
        ['2021-10-20','3'],
        ['2021-11-02','1'] 
        ]},
    {category:'Dev', value[
        ['2021-11-02','1'],
        ['2021-11-03','1']
        ]}]

你可以使用一些destructuringArray#reduce来做到这一点:

 let data = [ { section: 'group_date', category: 'Support', category_value: '2021-10-11', datavalue: '2', }, { section: 'group_date', category: 'Support', category_value: '2021-10-20', datavalue: '3', }, { section: 'group_date', category: 'Support', category_value: '2021-11-02', datavalue: '1', }, { section: 'group_date', category: 'Dev', category_value: '2021-11-02', datavalue: '1', }, { section: 'group_date', category: 'Dev', category_value: '2021-11-03', datavalue: '1', }, ]; let seen = []; let res = data.reduce((acc, { category, category_value, datavalue }) => { let index = seen.indexOf(category); if (index === -1) { seen.push(category); acc.push({ category, value: [[category_value, datavalue]] }); } else { acc[index].value.push([category_value, datavalue]); } return acc; }, []); console.log(res);

或者像这样使用for...of循环:

 let data = [ { section: 'group_date', category: 'Support', category_value: '2021-10-11', datavalue: '2', }, { section: 'group_date', category: 'Support', category_value: '2021-10-20', datavalue: '3', }, { section: 'group_date', category: 'Support', category_value: '2021-11-02', datavalue: '1', }, { section: 'group_date', category: 'Dev', category_value: '2021-11-02', datavalue: '1', }, { section: 'group_date', category: 'Dev', category_value: '2021-11-03', datavalue: '1', }, ]; let res = []; let seen = []; for ({ category, category_value, datavalue } of data) { let index = seen.indexOf(category); if (index === -1) { seen.push(category); res.push({ category, value: [[category_value, datavalue]] }); } else { res[index].value.push([category_value, datavalue]); } } console.log(res);

我认为在这里使用 for 循环应该没问题。 就像是:

let newObject = {};

let originalList = [{section: 'group_date', category: 'Support', category_value: '2021-10-11', datavalue: '2'}
{section: 'group_date', category: 'Support', category_value: '2021-10-20', datavalue: '3'}
{section: 'group_date', category: 'Support', category_value: '2021-11-02', datavalue: '1'}
{section: 'group_date', category: 'Dev', category_value: '2021-11-02', datavalue: '1'}
{section: 'group_date', category: 'Dev', category_value: '2021-11-03', datavalue: '1'}]

originalList.forEach(item => {
    if (item.category in newObject) {
        newObject[item.category].push([item.category_value, item.datavalue])
    }
    else {
        newObject[item.category] = [[item.category_value, item.datavalue]]
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM