使用第二个数组的顺序对第一个数组进行排序

时间:2016-07-04 07:05:35

标签: javascript sorting underscore.js

假设我有两个数组,即 namesArray 名称,如下所示

var namesArray = [{"name":"Charlie","age":3},{"name":"Dog","age":1},{"name":"Baker","age":7},{"name":"Abel","age":9}];

var names = ['Baker', 'Dog', 'Abel', 'Charlie']; 

我是否可以在 UnderscoreJS 中实现以下功能,以便按顺序对名为 namesArray 的数组进行排序,以便 namesArray 的所有名称元素将与名称的顺序相同。

3 个答案:

答案 0 :(得分:2)

在普通的Javascript中,您可以将Array#sort与对象一起用作排序顺序的参考。

var namesArray = [{ "name": "Charlie", "age": 3 }, { "name": "Dog", "age": 1 }, { "name": "Baker", "age": 7 }, { "name": "Abel", "age": 9 }],
    names = ['Baker', 'Dog', 'Abel', 'Charlie'],
    hash = Object.create(null);

names.forEach(function (a, i) {
    hash[a] = i + 1;
});

namesArray.sort(function (a, b) {
    return (hash[a.name] || 0) - (hash[b.name] || 0);
});

console.log(namesArray);

答案 1 :(得分:2)

sort()中查找每个名称的索引。不像创建索引的哈希那样高效,但是它也不是那么重要

namesArray.sort(function(a,b){
  return names.indexOf(a.name) - names.indexOf(b.name);
});

答案 2 :(得分:0)

与次要内容没什么关系,但你可以这样做: 我认为在性能方面使用像what Nina does这样的哈希比indexOf更好。

var namesArray = [{ "name": "Charlie", "age": 3 }, { "name": "Dog", "age": 1 }, { "name": "Baker", "age": 7 }, { "name": "Abel", "age": 9 }];

var names = ['Baker', 'Dog', 'Abel', 'Charlie'];
var sorted = _.sortBy(namesArray, o => names.indexOf(o.name));

console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>