过滤和排序 JavaScript 数组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/39302871/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 22:26:28  来源:igfitidea点击:

Filter and sort a JavaScript array

javascriptarrayssorting

提问by James

I have an array like this:

我有一个这样的数组:

[{
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 6.4
    }
}, {
    "number": "3",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}, {
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}]

I am trying to create a new array with the following criteria:

我正在尝试使用以下条件创建一个新数组:

  1. Get highest rating (array.rating.average) of each number (array.number)
  1. 获得array.rating.average每个数字 ( array.number) 的最高评分( )

Output should be:

输出应该是:

[{
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 6.4
    }
}, {
    "number": "3",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}
}]

I have just managed to sort by highest rating:

我刚刚设法按最高评分排序:

array.sort(function(a , b) {
    return a.rating.average - b.rating.average;
});
array.reverse();

But, now, I just only want one object per duplicate array.number, keeping the one that has the highest array.rating.average.

但是,现在,我只想要每个副本一个对象array.number,保留具有最高array.rating.average.

回答by Haibara Ai

array.sort((a, b) => {
  if(a.number === b.number) {
    // If two elements have same number, then the one who has larger rating.average wins
    return b.rating.average - a.rating.average;
  } else {
    // If two elements have different number, then the one who has larger number wins
    return b.number - a.number;
  }
});


array = array.filter((element, index) => {
  return index === 0 || element.number !== array[index-1].number;
});

For your test case,

对于您的测试用例,

[{
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 6.4
  }
}, {
  "number": "3",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}, {
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}]

After sorting, the output would be

排序后,输出将是

[{
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 6.4
  }
}, {
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}, {
  "number": "3",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}]

And after filter, the final result:

过滤后,最终结果:

[{
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 6.4
  }
}, {
  "number": "3",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}]

回答by StardustGogeta

arr = [{
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 6.4
    }
}, {
    "number": "3",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}, {
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}]

arr = arr.sort(function(a,b){return b.number-a.number || b.rating.average-a.rating.average}).filter(function(a,b,c){return !b || c[b-1].number != a.number});
console.log(arr);

I believe that this will solve your problem by sorting and filtering.

我相信这将通过排序和过滤来解决您的问题。

EDIT: Should now support older browsers.

编辑:现在应该支持旧浏览器。

回答by Daniel Tran

First you create a dictionary for keeping the highest rating for each number:

首先,您创建一个字典来保持每个数字的最高评分:

var data = [{
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 6.4
    }
}, {
    "number": "3",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}, {
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}];


var filterMap = {};
data.forEach(function (item) {
  if (!filterMap[item.number] || filterMap[item.number].rating.average < item.rating.average) {
    filterMap[item.number] = item;
  }
})

var result = [];

for (var number in filterMap) {
  result.push(filterMap[number]);
}


result.sort(function(a , b) {
   return b.rating.average - a.rating.average;
});

console.log(result);

回答by jenish

Simply you can use lodash method for sort by anything that you want to sort by fileName, number, etc.

简单地,您可以使用 lodash 方法按您想按文件名、数字等排序的任何内容进行排序。

const _ = require('lodash');

var data = [{
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 6.4
  }
}, {
  "number": "3",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}, {
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}]

var result = _.sortBy(data, ['number']);

console.log(result)

Output:
[ { number: '3', fileName: 'fileXX', rating: { average: 5.4 } },
  { number: '4', fileName: 'fileXX', rating: { average: 6.4 } },
  { number: '4', fileName: 'fileXX', rating: { average: 5.4 } } ]