gpt4 book ai didi

javascript - 如何根据每行的总和对二维数组进行排序?

转载 作者:行者123 更新时间:2023-11-29 19:04:50 24 4
gpt4 key购买 nike

打扰一下,一个简单的问题:

我有一个二维元素数组,其中每个元素都封装了一个 int 值。像这样:

MyComponent = {... , value: 2, ...} // each instance has a value property

MyArray = [
[Component1, Component2],
[Component3],
[Component4, Component5, Component6, Component7],
... ]

我想根据每行中元素的 value 之和对我的二维数组行进行排序。

详细一点:我有一组选择(组合)供用户选择,其中任何组中的每个单一选择都有一定的值(value)。我想首先显示具有最高 sumtotal 的组合(因此它是降序的)。

在 javascript 中实现该目标的快速有效方法是什么?

最佳答案

var originalArray = [
[{value: 2}, {value: 3}],
[{value: 11}],
[{value: 1}, {value: 2}, {value: 3}, {value: 4}]
];
var sortedArray = originalArray.sort(function(row1, row2) {
add = function(a, b) {return a + b.value};
return row1.reduce(add, 0) - row2.reduce(add, 0);
});
console.log(sortedArray);

让我们分解一下,好吗?

我们从原始数组开始:

var originalArray = [
[{value: 2}, {value: 3}],
[{value: 11}],
[{value: 1}, {value: 2}, {value: 3}, {value: 4}]
];

然后我们对其进行排序。让我们从内而外地工作。首先,我们如何计算一行的总和?我们可以使用 reduce 函数:

exampleRow = [{value: 2}, {value: 3}];
add = function(a, b) {return a + b.value};
console.log(exampleRow.reduce(add, 0));

reduce 函数接受另一个函数(在本例中为 add)并使用它来遍历数组并将其reduce 为单个项目(通常是一个数字)。 reduce 需要一个接受两个参数的函数 - 运行总计和下一项。 Reduce 大致执行以下操作:

array.prototype.reduce = function(fn, initial) {
runningTotal = initial;
for (var i = 0; i <= array.length; i++) {
runningTotal = fn(runningTotal, array[i]);
}
return runningTotal;
}

换句话说,它从初始值开始,然后一遍又一遍地运行您的函数,每次运行都使用上次运行的输出和数组中的下一项。

在我们的例子中,fn 函数是add:

add = function(a, b) {return a + b.value};

add 很简单;它采用运行总计 (a) 并添加下一项 (b) 的 value。在整个数组中,这简化为 0 + array[0].value + array[1].value + ... + array[array.length-1].value -数组。

我们快到了!最后一部分是实际排序。我们使用 sort 函数来做到这一点(惊喜!)。 sort 函数还接收一个带有两个参数的函数,用于迭代数组。但是,您为 sort 提供的函数必须返回一个数字。 sort 使用这个函数来比较两个参数;如果输出为正,则第一项“更大”,而如果输出为负,则第二项“更大”。 (如果输出为零,则它们相等。)sort 使用它按升序对数组进行排序。

在我们的例子中,我们的函数接受两行并返回第一行的总和减去另一行的总和。这意味着如果第一行的总和更大,则 ist 将位于数组的后面,反之亦然。

关于javascript - 如何根据每行的总和对二维数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43723003/

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