Sort方法将json排序为包含唯一值数组的json



我正在寻找一种对大数据集进行排序的方法,类似于下面提供的方法,而不使用大循环。我希望将"439190"的数据排序为多个数组,每个数组中只包含1个"colored"。我一直在研究所有的过滤、映射和减少方法,但都没有成功,如果有人能给我指明正确的方向,那就太好了。

原始Json输出:

{ '439190':
[ { assetid: '9354886749',
classid: 439190,
colorid: '1650467837',
category: 'student',
favouritecolor: '439190-Red' },
{ assetid: '9354886743',
classid: 439190,
colorid: '1650467837',
category: 'student',
favouritecolor: '439190-Red' },
{ assetid: '9354886777',
classid: 439190,
colorid: '1650467837',
category: 'student',
favouritecolor: '439190-Red' },
{ assetid: '9354886726',
classid: 439190,
colorid: '1650746832',
category: 'student',
favouritecolor: '439190-Blue' },
{ assetid: '9354886755',
classid: 439190,
colorid: '1650746832',
category: 'student',
favouritecolor: '439190-Blue' },
{ assetid: '9354886753',
classid: 439190,
colorid: '1650746832',
category: 'student',
favouritecolor: '439190-Blue' },
{ assetid: '9354869964',
classid: 439190,
colorid: '1649236744',
category: 'student',
favouritecolor: '439190-Green' },
{ assetid: '9354869970',
classid: 439190,
colorid: '1649236744',
category: 'student',
favouritecolor: '439190-Green' },
{ assetid: '9354869963',
classid: 439190,
colorid: '1649236744',
category: 'student',
favouritecolor: '439190-Green' },
{ assetid: '9354886738',
classid: 439190,
colorid: '1651234125',
category: 'student',
favouritecolor: '439190-Yellow' },
{ assetid: '9354886773',
classid: 439190,
colorid: '1651234125',
category: 'student',
favouritecolor: '439190-Yellow' },
{ assetid: '9354886739',
classid: 439190,
colorid: '1651234125',
category: 'student',
favouritecolor: '439190-Yellow' },
{ assetid: '9354869966',
classid: 439190,
colorid: '1651726369',
category: 'student',
favouritecolor: '439190-Pink' },
{ assetid: '9354886767',
classid: 439190,
colorid: '1651726369',
category: 'student',
favouritecolor: '439190-Pink' },
{ assetid: '9354886727',
classid: 439190,
colorid: '1651726369',
category: 'student',
favouritecolor: '439190-Pink' },
{ assetid: '9354886763',
classid: 439190,
colorid: '1642929857',
category: 'student',
favouritecolor: '439190-Orange' },
{ assetid: '9354886722',
classid: 439190,
colorid: '1642929857',
category: 'student',
favouritecolor: '439190-Orange' },
{ assetid: '9354886762',
classid: 439190,
colorid: '1642929857',
category: 'student',
favouritecolor: '439190-Orange' } ],

预期输出(粗略但希望你能明白(:

{ '439190':
[ [ { assetid: '9354886749',
classid: 439190,
colorid: '1650467837',
category: 'student',
favouritecolor: '439190-Red' },
{ assetid: '9354886726',
classid: 439190,
colorid: '1650746832',
category: 'student',
favouritecolor: '439190-Blue' },
{ assetid: '9354869964',
classid: 439190,
colorid: '1649236744',
category: 'student',
favouritecolor: '439190-Green' },
{ assetid: '9354886738',
classid: 439190,
colorid: '1651234125',
category: 'student',
favouritecolor: '439190-Yellow' },
{ assetid: '9354869966',
classid: 439190,
colorid: '1651726369',
category: 'student',
favouritecolor: '439190-Pink' },
{ assetid: '9354886763',
classid: 439190,
colorid: '1642929857',
category: 'student',
favouritecolor: '439190-Orange' } ],
[ { assetid: '9354886743',
classid: 439190,
colorid: '1650467837',
category: 'student',
favouritecolor: '439190-Red' },
{ assetid: '9354886755',
classid: 439190,
colorid: '1650746832',
category: 'student',
favouritecolor: '439190-Blue' },
{ assetid: '9354869970',
classid: 439190,
colorid: '1649236744',
category: 'student',
favouritecolor: '439190-Green' },
{ assetid: '9354886773',
classid: 439190,
colorid: '1651234125',
category: 'student',
favouritecolor: '439190-Yellow' },
{ assetid: '9354886767',
classid: 439190,
colorid: '1651726369',
category: 'student',
favouritecolor: '439190-Pink' },
{ assetid: '9354886722',
classid: 439190,
colorid: '1642929857',
category: 'student',
favouritecolor: '439190-Orange' } ],
[ { assetid: '9354886777',
classid: 439190,
colorid: '1650467837',
category: 'student',
favouritecolor: '439190-Red' },
{ assetid: '9354886753',
classid: 439190,
colorid: '1650746832',
category: 'student',
favouritecolor: '439190-Blue' },
{ assetid: '9354869963',
classid: 439190,
colorid: '1649236744',
category: 'student',
favouritecolor: '439190-Green' },
{ assetid: '9354886739',
classid: 439190,
colorid: '1651234125',
category: 'student',
favouritecolor: '439190-Yellow' },
{ assetid: '9354886727',
classid: 439190,
colorid: '1651726369',
category: 'student',
favouritecolor: '439190-Pink' },
{ assetid: '9354886762',
classid: 439190,
colorid: '1642929857',
category: 'student',
favouritecolor: '439190-Orange' } ] ],

我当前的代码:

for(i in json){
test = Array.from(new Set(json[i].map(item => item.colorid)))
.map( colorid=> {
return {
"assetid":json[i].find(s => s.colorid=== colorid).assetid,
"classid":json[i].find(s => s.colorid=== colorid).classid,
"colorid":colorid,
"category":json[i].find(s => s.colorid=== colorid).category,
"favouritecolor":json[i].find(s => s.colorid=== colorid).favouritecolor
};
});
console.log(test);
}

它确实过滤结果,使其只包含唯一的颜色,并保留所有关键数据,尽管它只返回一个数组。我已经到了这一点,但我一直未能找到一种有效的方法(不使用多个嵌套循环(来获得上面显示的预期输出。如果能帮助我改进代码或为我指明正确的方向,我们将不胜感激:(

我只是把这些放在一起给你一些指针,但这样的东西应该会有所帮助。您需要创建一个reduce函数,该函数具有一个数组数组作为累加器。然后检查每个数组,看看是否存在匹配的元素,并将其添加到第一个不存在的数组中。如果元素存在于每个数组中,则推送一个新的元素。

const array = [1, 2, 3, 4, 6, 4, 5, 6, 4];
const listReducer = (accumulator, currentValue) => {
let pushed = false;
accumulator.forEach((list) => {
if (!list.includes(currentValue)) {
list.push(currentValue);
pushed = true;
}
});
if (!pushed) {
accumulator.push([currentValue]);
}
return accumulator;
}
const startingValue = [];
console.log(array.reduce(listReducer, startingValue));

最新更新