繁体   English   中英

在对象数组中找到 5 个最大的数字并将其推入另一个数组

[英]Find 5 largest numbers in array of objects and push it to another array

我有一个对象数组,我想在 object 值中找到五个最大的数字,并将这五个对象推送到新数组,但也将它们从第一个数组中删除。 我试过将 for 循环与 push 和 splice 方法结合使用,但结果有点奇怪。 这是我尝试过的一个例子

 const arrOfObjs = [ {number: 1, bla: 'sadsad'}, {number: 2, bla: 'sadsad'}, {number: 3, bla: 'sadsad'}, {number: 9, bla: 'sadsad'}, {number: 4, bla: 'sadsad'}, {number: 10, bla: 'sadsad'}, {number: 5, bla: 'sadsad'}, {number: 6, bla: 'sadsad'}, {number: 7, bla: 'sadsad'}, {number: 8, bla: 'sadsad'}, ] let largestNumbers = []; for(var i=0; i<5; i++) { largestNumbers.push( arrOfObjs.splice( arrOfObjs.indexOf( Math.max.apply( Math,arrOfObjs.map(function(o){ return o.number; }) ) ), 1)[0]) } console.log(largestNumbers)

一切似乎都在起作用,而不是最终结果,应该是

[{
  bla: "sadsad",
  number: 8
 }, {
  bla: "sadsad",
  number: 7
 }, {
  bla: "sadsad",
  number: 6
 }, {
  bla: "sadsad",
  number: 9
 }, {
  bla: "sadsad",
  number: 10
}]

我不确定为什么不返回数字 9,以及为什么返回数字 5。 我究竟做错了什么? 提前致谢!

错误在indexOf部分。 你不会找到最大值,因为你的数组有对象(应该比较的是number属性)。 所以更换

arrOfObjs.indexOf(Math.max ........)

和:

arrOfObjs.findIndex(o => o.number === max)

... 其中maxMath.max表达式,您应该单独执行,如下所示:

for(var i=0; i<5; i++) {
   let max = Math.max.apply(
      Math,
      arrOfObjs.map(o => o.number)
   );
   largestNumbers.push(arrOfObjs.splice(
      arrOfObjs.findIndex(o => o.number === max), 1)[0]
   );
}

问题是您使用 integer 作为参数对包含对象的数组执行.indexOf

试试.findIndex(({number})=>number === Math.max.apply...

 const arrOfObjs = [ {number: 1, bla: 'sadsad'}, {number: 2, bla: 'sadsad'}, {number: 3, bla: 'sadsad'}, {number: 9, bla: 'sadsad'}, {number: 4, bla: 'sadsad'}, {number: 10, bla: 'sadsad'}, {number: 5, bla: 'sadsad'}, {number: 6, bla: 'sadsad'}, {number: 7, bla: 'sadsad'}, {number: 8, bla: 'sadsad'}, ] let largestNumbers = []; for (var i = 0; i < 5; i++) { largestNumbers.push( arrOfObjs.splice( arrOfObjs.findIndex(({ number }) => number === Math.max.apply( Math, arrOfObjs.map(function(o) { return o.number; }) ) ), 1)[0]) } console.log(largestNumbers)

我会把它排序然后切片。

 const arrOfObjs = [ {number: 1, bla: 'sadsad'}, {number: 2, bla: 'sadsad'}, {number: 3, bla: 'sadsad'}, {number: 9, bla: 'sadsad'}, {number: 4, bla: 'sadsad'}, {number: 10, bla: 'sadsad'}, {number: 5, bla: 'sadsad'}, {number: 6, bla: 'sadsad'}, {number: 7, bla: 'sadsad'}, {number: 8, bla: 'sadsad'}, ] console.log(arrOfObjs.sort((a,b)=> a.number - b.number).slice(-5))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM