按另一个数组

时间:2015-11-26 01:03:09

标签: javascript underscore.js

我有一系列名字:

[
  {last_name: "A", name: "James" }, 
  {last_name: "A", name: "Robert" }, 
  {last_name: "B", name: "Tim"}, 
  {last_name: "B", name: "Bob" },
  {last_name: "C", name: "Ricky Ticky" }
]

然后我按照特定的顺序在其中包含每个last_name的数组:

["B", "C", "A"]

如何按照第二个数组中last_names的顺序对我的集合进行排序?

我尝试了什么:

我到目前为止最好的解决方案是创建一个新数组,然后循环遍历我的名字集合,推送与我的排序数组的第一个索引(“B”)匹配的所有元素,然后是第二个索引(“C”) ),最后是“A”。似乎冗长或者下划线.js有更好的方法。

3 个答案:

答案 0 :(得分:6)

使用Underscore的sortBy函数,使您能够对数组元素的任意特征进行排序:

var people = [
  {last_name: "A", name: "James" }, 
  {last_name: "A", name: "Robert" }, 
  {last_name: "B", name: "Tim"}, 
  {last_name: "B", name: "Bob" },
  {last_name: "C", name: "Ricky Ticky" }
];

var lastNameOrder = ["B", "C", "A"];

var sortedPeople = _.sortBy(people, function(person) {
  return lastNameOrder.indexOf(person.last_name);
})

console.log(sortedPeople);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

答案 1 :(得分:1)

使用Array.sort()可以很简单地完成。

function sortNames(names, order) {
  return names.sort(function(a,b) {
    if (order.indexOf(a.last_name) > order.indexOf(b.last_name)) return 1;
    return 0;
  });
}

Array.prototype.sort()将通过一次比较两个值来对数组进行排序。如果你返回1,b来自a; -1,a之前的b;零是没有变化的。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

的更多信息

答案 2 :(得分:1)

已编辑:因严重失败

但它仍然没有对名称进行排序,因为我看不出有任何理由不这样做

var people = [
  {last_name: "A", name: "James" }, 
  {last_name: "A", name: "Robert" }, 
  {last_name: "B", name: "Tim"}, 
  {last_name: "B", name: "Bob" },
  {last_name: "C", name: "Ricky Ticky" }
];

var lastNameOrder = ["B", "C", "A"];

var sortedPeople = people.sort(function(person1,person2){
  var lna =  lastNameOrder.indexOf(person1.last_name);
  var lnb =  lastNameOrder.indexOf(person2.last_name);

  if(lna === lnb){
    return (person1.name < person2.name) ? -1 : 
           (person1.name > person2.name) ?  1 : 0;
  } else {
    return lna-lnb;
  }
})
相关问题