gpt4 book ai didi

javascript - 按与另一个值相关的值的升序对对象数组进行排序

转载 作者:行者123 更新时间:2023-11-29 19:05:37 25 4
gpt4 key购买 nike

我希望按照与另一个值相关的值的升序对对象的 JSON 数组进行排序。听起来很困惑,因为它确实如此。我在数组中的每个对象中都有属性“列”和“顺序”。我需要这样的顺序:第一列中的最低数字,第二列中的最低数字,第三列中的最低数字,第一列中第二低的数字,第二列中第二低的数字,第三列中第二低的数字,然后继续。当“order”具有完全相同的值时,这很容易,您可以使用如下排序函数:

function sortCourses(a, b){
if (a.order == b.order) {
return (a.column - b.column);
} else {
return (a.order - b.order);
}
}

问题是我并不总是这样设置它们。这是一个示例数组:

[
{
column: 2,
order: 5
},
{
column: 1,
order: 1
},
{
column: 3,
order: 2
},
{
column: 3,
order: 1
},
{
column: 1,
order: 4
},
{
column: 2,
order: 1
},
{
column: 3,
order: 3
},
{
column: 1,
order: 3
},
{
column: 2,
order: 3
},
{
column: 1,
order: 2
}
]

排序后,我需要这个数组看起来像:

[
{
column: 1,
order: 1
},
{
column: 2,
order: 1
},
{
column: 3,
order: 1
},
{
column: 1,
order: 2
},
{
column: 2,
order: 3
},
{
column: 3,
order: 2
},
{
column: 1,
order: 3
},
{
column: 2,
order: 5
},
{
column: 3,
order: 3
},
{
column: 1,
order: 4
}
]

关于如何实现此目标的任何想法?

最佳答案

可能会快一点,但希望容易理解。

const data = [
{ column: 2, order: 5 }, { column: 1, order: 1 }, { column: 3, order: 2 },
{ column: 3, order: 1 }, { column: 1, order: 4 }, { column: 2, order: 1 },
{ column: 3, order: 3 }, { column: 1, order: 3 }, { column: 2, order: 3 },
{ column: 1, order: 2 }
];

// Sort by order.
data.sort(function (a, b) {
return (a.order - b.order);
});

// Group by column.
const groups = data.reduce(
function (acc, value) {
if (!acc[value.column]) {
acc[value.column] = [];
}
acc[value.column].push(value);
return acc;
}, {});

// Get sorted columns.
const cols = Object.keys(groups).map(Number).sort();

// Loop over columns taking lowest value until we're out of values.
const out = [];
while (out.length < data.length) {
cols.forEach(
function (col) {
if (groups[col].length) {
out.push(groups[col].shift(0));
}
});
}

console.log(out);

关于javascript - 按与另一个值相关的值的升序对对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43106782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com