按字符串属性值对对象数组进行排序

新手上路,请多包涵

我有一组 JavaScript 对象:

var objs = [
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

如何按 JavaScript 中 last_nom 的值对它们进行排序?

我知道 sort(a,b) ,但这似乎只适用于字符串和数字。我需要向我的对象添加 toString() 方法吗?

原文由 Tyrone Slothrop 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 899
2 个回答

编写自己的比较函数很容易:

 function compare( a, b ) {
 if ( a.last_nom < b.last_nom ){
 return -1;
 }
 if ( a.last_nom > b.last_nom ){
 return 1;
 }
 return 0;
 }

 objs.sort( compare );

或内联(c/o Marco Demaio):

 objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))

或简化为数字(c/o Andre Figueiredo):

 objs.sort((a,b) => a.last_nom - b.last_nom); // b - a for reverse sort

原文由 Wogan 发布,翻译遵循 CC BY-SA 4.0 许可协议

您还可以创建一个动态排序函数,根据您传递的值对对象进行排序:

 function dynamicSort(property) {
    var sortOrder = 1;
    if(property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a,b) {
        /* next line works with strings and numbers,
         * and you may want to customize it to your needs
         */
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

所以你可以有一个像这样的对象数组:

 var People = [
    {Name: "Name", Surname: "Surname"},
    {Name:"AAA", Surname:"ZZZ"},
    {Name: "Name", Surname: "AAA"}
];

…当你这样做时它会起作用:

 People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));

其实这已经回答了问题。写下面的部分是因为很多人联系我,抱怨 它不能使用多个参数

多个参数

您可以使用下面的函数生成具有多个排序参数的排序函数。

 function dynamicSortMultiple() {
    /*
     * save the arguments object as it will be overwritten
     * note that arguments object is an array-like object
     * consisting of the names of the properties to sort by
     */
    var props = arguments;
    return function (obj1, obj2) {
        var i = 0, result = 0, numberOfProperties = props.length;
        /* try getting a different result from 0 (equal)
         * as long as we have extra properties to compare
         */
        while(result === 0 && i < numberOfProperties) {
            result = dynamicSort(props[i])(obj1, obj2);
            i++;
        }
        return result;
    }
}

这将使您能够执行以下操作:

 People.sort(dynamicSortMultiple("Name", "-Surname"));

子类数组

对于我们当中可以使用 ES6 的幸运儿,它允许扩展本机对象:

 class MyArray extends Array {
    sortBy(...args) {
        return this.sort(dynamicSortMultiple(...args));
    }
}

这将使这个:

 MyArray.from(People).sortBy("Name", "-Surname");

原文由 Ege Özcan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题