javascript - 通过对象属性从对象数组中删除小于另一个的元素

标签 javascript arrays

我有一个对象数组:

[
{
  incoming_number: 1,
  incoming_number_fraction: 0,
  article:'a1'
},
{
  incoming_number: 2,
  incoming_number_fraction: 0,
  article:'a2'
},
{
  incoming_number: 2,
  incoming_number_fraction: 2,
  article:'a3'
},
{
  incoming_number: 3,
  incoming_number_fraction: 0,
  article:'a4'
},
{
  incoming_number: 4,
  incoming_number_fraction: 0,
  article:'a5'
},
{
  incoming_number: 4,
  incoming_number_fraction: 2,
  article:'a6'
},
{
  incoming_number: 4,
  incoming_number_fraction: 4,
  article:'a7'
},
]

任务是通过以下逻辑从数组中删除元素:如果存在具有相似“incoming_number”的元素,我们必须保存最大“incoming_number_fraction”的元素并删除所有其他人。
结果应该是:

[
{
      incoming_number: 1,
      incoming_number_fraction: 0
},
{
      incoming_number: 2,
      incoming_number_fraction: 2
},
{
      incoming_number: 3,
      incoming_number_fraction: 0
},
{
      incoming_number: 4,
      incoming_number_fraction: 4
},
]  

数组中有很多元素(超过 10000 个),我想以最少的步骤完成此操作。

编辑
我尝试这样的事情:

for (let i = 0; i < arr.length ; i++) {  
if (arr[i]['incoming_number'] === arr[i + 1]['incoming_number']) {
  let j = i + 1
  while (arr[j]['incoming_number'] === arr[j + 1]['incoming_number']) {
    j++
  }
}

arr.splice(i, j-1)
}  

但它不起作用...
编辑2
添加有关数组中对象的更多信息。

最佳答案

使用 findIndex 或 grep 在大数组中查找选定的数字会降低性能。 因此,使用数字作为属性将是查找对象和更改 incoming_number_fraction 的最快方法。

使用 grep、findindex 可能会产生更小的代码,但不会产生更好的性能,在您的情况下,您需要更高的性能而不是更小的代码。

看看我的例子并告诉我。

var arr=[
{
  incoming_number: 1,
  incoming_number_fraction: 0,
  article:'a1'
},
{
  incoming_number: 2,
  incoming_number_fraction: 0,
  article:'a2'
},
{
  incoming_number: 2,
  incoming_number_fraction: 2,
  article:'a3'
},
{
  incoming_number: 3,
  incoming_number_fraction: 0,
  article:'a4'
},
{
  incoming_number: 4,
  incoming_number_fraction: 0,
  article:'a5'
},
{
  incoming_number: 4,
  incoming_number_fraction: 2,
  article:'a6'
},
{
  incoming_number: 4,
  incoming_number_fraction: 4,
  article:'a7'
},
]

var finalResult = [];
var result = {};
var includedNumbers = []
arr.forEach(function(item){
var number = item.incoming_number;
if (!result[item.incoming_number]){ // with Index, is the fastest way 
     result[number] = item;
     includedNumbers.push(number);
  }else {
     if (result[number].incoming_number_fraction< item.incoming_number_fraction ){
         result[number] = item;
     }
   
  }
});

// now lets clean the result 
includedNumbers.forEach(function(item){
  finalResult.push(result[item])
});

console.log(finalResult)

关于javascript - 通过对象属性从对象数组中删除小于另一个的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54355972/

相关文章:

Javascript:从数组中的对象中选择属性

javascript - .live() 中的 jQuery .select() 在 IE7 和 IE8 上不起作用

javascript - 阻止 Smart Client 将 Array 类元素添加到我的数组中

JQuery 从输入中获取表行值并保存到数组

sscanf() 中的字符指针

c++ - 如何将无符号字符数组解析为数值数据

javascript - 制表符时 CSS 周围有一些空间

javascript - 将隐藏行的值获取到 JavaScript 中

c# - 将图像控件转换为字节数组 Asp.Net

javascript - Firebase,变量作为键名