从数组中获取三个最小值

3
假设我有一个如下的 JSON 对象:
{"27":[2300,2300,2700,2300,2300,2300,2500,2300,2700,2300,2300,2300,2700,2300,2700,2300,2300,2300,2300,1900,2700,2300,2300,2300]}

我希望从这个数组中获取三个最小值并将其存储为另一个数组。我尝试过使用sort(),但发现它认为10000比1300低,例如。
问题:如何从上述JSON对象中获取三个最低的值并将其存储为自己的数组?
这是我尝试对数组进行排序的方式:
-prices[searchLog.PriceSearchId].sort();

2
使用自己的回调函数进行排序 - ES2015+ 可以使用 array.sort((a, b) => a-b).slice(0,3) - Jaromanda X
请将您的代码发布 - LF00
1
https://jsfiddle.net/03e13wv4/ - adeneo
@JaromandaX,我实际上想要三个最低值,无论它们是否存在多次。 - kentor
kentor - @naveen 的回答已经足够好了。 - Jaromanda X
显示剩余3条评论
2个回答

5
尝试这个。

var prices = {
  "27": [2300, 2300, 2700, 2300, 2300, 2300, 2500, 2300, 2700, 2300, 2300, 2300, 2700, 2300, 2700, 2300, 2300, 2300, 2300, 1900, 2700, 2300, 2300, 2300]
};
var leastThree = prices["27"].sort(function(a, b) {
  return a - b;
}).slice(0, 3);
console.log(leastThree);


0

由于您想要一个固定数量的最低值,因此无需使用时间复杂度最好为O(N * log N)sort()

以下代码的时间复杂度为O(N)

var prices = {
  "27": [2300, 2300, 2700, 2300, 2300, 2300, 2500, 2300, 2700, 2300, 2300, 2300, 2700, 2300, 2700, 2300, 2300, 2300, 2300, 1900, 2700, 2300, 2300, 2300]
};
var arr = prices['27'];

var lowest = new Array(3).fill(Number.MAX_SAFE_INTEGER);

for (var i = arr.length; --i >= 0; ) {
   var x = arr[i];
   // Update "lowest" array, as appropriate
   for (var j = 0; j < lowest.length; j++) {
     if (x < lowest[j]) {
       lowest.splice(j, 0, x);
       lowest.pop();
       break;
     }
   }
}

console.log(lowest);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接