如何在JavaScript中对具有多个字段值的对象数组进行排序

我发现了一个很好的方法来基于以下定义的属性之一对对象数组进行排序:

在JavaScript中按字符串属性值排序对象数组

使用该功能对于单一排序(在所有浏览器上)都是完美的,甚至可以在另一种排序中使用谷歌浏览器! 这是EgeÖzcan对物体阵列的伟大排序例程

function dynamicSort(property) { 
    return function (a,b) {
        return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
    }
}

使用名为“Data”的数组(当然,我的数组有更多的对象)...

var Data = [{Category: "Business", Value: "ABC"},{Category:"Personal", Value:"XYZ"}];

我可以通过这样做得到一个适当的排序顺序列出每个类别内的所有值...

Data.sort(dynamicSort("Value"));
Data.sort(dynamicSort("Category"));

通过首先对Value排序,然后按Category排序,我的数组按照排序顺序排列所有值,首先列出所有业务基础值,然后再列出所有基于个人的值。 完善! 除了Chrome中的数据按类别正确排序外,但每个类别中值的顺序似乎相当随机。

是否有人知道一种更好的方式来进行排序,这种排序也适用于Chrome?


我创建了dynamicSort函数的多参数版本:

function dynamicSort(property) { 
    return function (obj1,obj2) {
        return obj1[property] > obj2[property] ? 1
            : obj1[property] < obj2[property] ? -1 : 0;
    }
}

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;
    }
}

我创建了一个数组,如下所示:

var arr = [
    {a:"a",b:"a",c:"a"},
    {a:"b",b:"a",c:"b"},
    {a:"b",b:"a",c:"a"},
    {a:"b",b:"a",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"b",b:"b",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"b",b:"b",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"b",b:"b",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"c",b:"b",c:"b"},
    {a:"c",b:"c",c:"a"}
];

当我这样做的时候它就工作了,

arr.sort(dynamicSortMultiple("c","b","a"));

这是一个工作示例:http://jsfiddle.net/ZXedp/


执行Javascript Multi-Criteria Sort(或多参数排序)的最简单方法是使用.sort ,将多个参数连接在一起,然后比较两个stings。

例如:

data.sort(function (a, b) {

  var aConcat = a["property1"] + a["property2"];
  var bConcat = b["property1"] + b["property2"];

  if (aConcat > bConcat) {
    return 1;
  } else if (aConcat < bConcat) {
    return -1;
  } else {
    return 0;
  }

});

我在这里包含了一个JsFiddle Script:http://jsfiddle.net/oahxg4u3/6/


您可能还想看看thenBy.js:https://github.com/Teun/thenBy.js

它允许您使用标准的Array.sort,但使用firstBy()。thenBy()。thenBy()样式。

链接地址: http://www.djcxy.com/p/3231.html

上一篇: How to sort an array of objects with multiple field values in JavaScript

下一篇: remove array value after index