我正在尝试使用 JavaScript 根据最大值对数组值进行排序,但它给了我错误的结果。这是我的代码:
function myFunction() {
var inputdata = [
[1001, 20],
[1002, 30],
[1001, 50],
[1003, 30],
[1002, 60],
[1003, 40],
[1001, 70]
];
var storedata = [];
for (var i = 0; i < inputdata.length; i++) {
if (i === 0) {
var data = {
'key': inputdata[i][0],
'value': inputdata[i][1]
};
storedata.push(data);
} else {
for (var j = 0; j < storedata.length; j++) {
if (storedata[j]['key'] == inputdata[i][0]) {
if (storedata[j]['value'] < inputdata[i][1]) {
storedata[j]['value'] = inputdata[i][1];
}
break;
} else {
var data = {
'key': inputdata[i][0],
'value': inputdata[i][1]
};
storedata.push(data);
}
}
}
}
console.log(storedata);
}
在这里,我尝试对值进行排序,例如1001,1002,1003
的最大值,但就我而言,预期的结果没有到来。
因为在您的内部循环中,当您使用 j
再次遍历数组时,其中一个条目可能已经是您正在寻找的条目,但您正在迭代的所有其他条目都不是,对于那些您正在复制条目。换句话说:将else {
部分移出循环,首先检查整个数组是否存在该条目,并且只有在不添加新条目时才检查:
var exists = false;
for(var j = 0; j < storeddata.length; j++) {
if(/*...*/) {
// merge
exists = true;
break;
} // don't insert here
}
if(!exists) {
// insert
}
此外,if(i === 0)
部分是不必要的(然后(,因为storeddata
仍然是空的,因此它将直接进入if(!exists)
部分并插入一个新条目。
我会把它写成(当然你的方式也有效,可以如上所述修复(:
const result = [];
for(const [key, value] of inputdata) {
const duplicate = result.find(entry => entry.key === key);
if(duplicate) {
duplicate.value = Math.max(duplicate.value, value);
} else {
result.push({ key, value });
}
}
还不清楚是要按第一个排序,然后是第二个数组数组,还是想简单地列出子数组的唯一值,第一个值仅在此处排序,或者您是否需要子数组中所有值的第一个值。
因此,我将提供所有这些(按子数组中的两个值排序(,然后是排序的第二个 ALL 值,然后是排序的子数组第一个元素的第三个唯一值。
var inputdata = [
[1001, 20],
[1002, 30],
[1001, 50],
[1003, 30],
[1002, 60],
[1003, 40],
[1001, 70]
];
/* sort by the first and second values */
var sortedArray = inputdata.sort(function(a, b) {
if (a[0] == b[0]) {
return b[1] - a[1];
}
return b[0] - a[0];
}).reverse();
console.log(sortedArray);
/* just get the unique first values sorted */
let iA = [];
inputdata.forEach(function(element) {
iA.push(element[0]);
});
/* all first values, sorted */
console.log(iA.sort());
/* unique first values sorted */
let uniqueSorted = [...new Set(iA)].sort();
console.log(uniqueSorted);