我得到了一个数组(见下面数组中的一个对象),我需要使用JavaScript按名字排序。 我该怎么做呢?

var user = {
   bio: null,
   email:  "user@domain.example",
   firstname: "Anna",
   id: 318,
   lastAvatar: null,
   lastMessage: null,
   lastname: "Nickson",
   nickname: "anny"
};

当前回答

Underscorejs提供了非常好的_。sortBy功能:

_.sortBy([{a:1},{a:3},{a:2}], "a")

或者你可以使用自定义排序函数:

_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})

其他回答

基本上你可以用sort方法对数组排序,但如果你想对对象排序,你就必须传递function给数组的sort方法,我会给你一个使用数组的例子

user = [
  {
    bio: "<null>",
    email: "user@domain.example",
    firstname: "Anna",
    id: 318,
    last_avatar: "<null>",
    last_message: "<null>",
    lastname: "Nickson",
    nickname: "anny",
  },
  {
    bio: "<null>",
    email: "user@domain.example",
    firstname: "Senad",
    id: 318,
    last_avatar: "<null>",
    last_message: "<null>",
    lastname: "Nickson",
    nickname: "anny",
  },
  {
    bio: "<null>",
    email: "user@domain.example",
    firstname: "Muhamed",
    id: 318,
    last_avatar: "<null>",
    last_message: "<null>",
    lastname: "Nickson",
    nickname: "anny",
  },
];

var ar = user.sort(function (a, b) {
  var nA = a.firstname.toLowerCase();
  var nB = b.firstname.toLowerCase();

  if (nA < nB) return -1;
  else if (nA > nB) return 1;
  return 0;
});

受到这个答案的启发,

users.sort((a,b) => (a.firstname  - b.firstname));

我很惊讶居然没人提到Collators。除非迫不得已,否则不应该使用localeCompare,因为它的性能明显较差

const collator = new Intl.Collator('zh-CN'); // Chinese Simplified for example

function sortAsc(a, b) {
  if (typeof a === 'string' && typeof b === 'string') {
    return collator.compare(b, a)
  }

  return b - a;
}

function sortDesc(a, b) {
  if (typeof a === 'string' && typeof b === 'string') {
    return collator.compare(a, b);
  }

  return a - b;
}

我们可以使用localeCompare,但也需要检查键是否有假值

如果一个条目缺少lname,下面的代码将无法工作。

obj.sort((a, b) => a.lname.localeCompare(b.lname))

所以我们需要检查如下所示的假值

让obj = [ {名称:“约翰”,lname:“母鹿”,地址:“阿拉斯加”}, {lname名字:“汤姆”:“希望”,地址:“加州”}, {名称:“哈利”,地址:“德州”} ] 让字段=“lname”; console.log (obj。sort((a, b) => (a[field] || ""). tostring()。localeCompare((b[field] || "").toString())));

OR

我们可以使用lodash,非常简单。它将检测返回值,即数字或字符串,并相应地进行排序。

import sortBy from 'lodash/sortBy';
sortBy(obj,'name')

https://lodash.com/docs/4.17.5#sortBy

就像这样:

array.sort(function(a, b){
 var nameA = a.name.toLowerCase(), nameB = b.name.toLowerCase();
 if (nameA < nameB) //sort string ascending
  return -1;
 if (nameA > nameB)
  return 1;
 return 0; //default return value (no sorting)
});