[英]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']
]}]
你可以使用一些destructuring
和Array#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.