无法使用 JavaScript 按最大值对数组进行排序



我正在尝试使用 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);

最新更新