首页 > 解决方案 > 在javascript中对多维数组进行排名

问题描述

几天来我一直在努力解决这个问题,但找不到解决方案。

我有一个如下所示的数组。

var myArr = [
[1, 10],
[0, 9],
[0, 8],
[0, 11],
[0, 12]
];

数据是待售商品的列表,第一个元素是 0,如果不是我的,1 代表我的商品,第二个元素是价格。

从这里我需要返回一个 1 与其他元素的排名 [3/5] 所以我需要按第二个元素对其进行排序,然后得到第一个元素的排名。

我一直在尝试使用此代码对其进行排序

myArr.sort(function (a, b) {
   return a[0] - b[0];
});

然后这个找到排名

    function getIndexOfK(arr, k) {
        for (var i = 0; i < arr.length; i++) {
            var index = arr[i].indexOf(k);
            if (index > -1) {
                return [i, index];
            }
        }
    }

    var needle = 1;
    var result = getIndexOfK(competitorsArr, needle);
    console.log('The value #' + needle + ' is located at array[' + result[0] + '][' + result[1] + '].');

但它每次都返回这个?

值 #1 位于数组 [0] [0] 中。

关于我做错了什么的任何指示?

非常感谢,

理查德

标签: javascriptarrays

解决方案


所以我需要按第二个元素对其进行排序,然后得到第一个元素的排名。

是的,但是,在您的代码中:

myArr.sort(function (a, b) {
  return a[0] - b[0];
});

您按第一个元素排序而不是第二个。修复它,它工作正常:

var myArr = [
  [1, 10],
  [0, 9],
  [0, 8],
  [0, 11],
  [0, 12]
];

myArr.sort(function(a, b) {
  return a[1] - b[1];
});


function getIndexOfK(arr, k) {
  for (var i = 0; i < arr.length; i++) {
    var index = arr[i].indexOf(k);
    if (index > -1) {
      return [i, index];
    }
  }
}
console.log(getIndexOfK(myArr, 1));

您可以通过识别商品的价格来降低时间复杂度,然后遍历数组并检查有多少商品更便宜O(N),不需要排序:

var myArr = [
  [1, 10],
  [0, 9],
  [0, 8],
  [0, 11],
  [0, 12]
];
const myPrice = myArr.find(([owner]) => owner === 1)[1];
const numCheaperThanMine = myArr.reduce(
  (a, [owner, price]) => (
    price < myPrice && owner !== 1
    ? ++a
    : a
  ),
  0
);
console.log(numCheaperThanMine);


推荐阅读