基于字符串将数组排序为数组new

时间:2014-05-15 21:04:16

标签: javascript arrays sorting

我尝试根据type将JSON排序为多个数组,我当前的json是:

// current json file:
{
    "res": [
        {
            "type" : "stream",
            "price" : "3.99",
            "id" : "13nee"
        },
        {
            "type" : "stream",
            "price" : "2.99",
            "id" : "8ejwj"
        },
        {
            "type" : "buy",
            "price" : "3.99".
            "id" : "9akwk"
        },      
        ...
    ]
}

我希望按type将其排序为多个数组,如下所示:

var sorted = {
    "stream" : [
        {
            "price" : "2.99",
            "id" : "8ejwj"
        },
        {
            "price" : ".99",
            "id" : "13nee"
        },

        ... // other objects with type: "stream"
    ],
    "buy" : [
        {
            "price" : "3.99".
            "id" : "9akwk"
        },
        ... // other objects with type: "buy"
    ]
}

我已经尝试过了,但我能想到的唯一解决方案就是通过案例 - 运行if循环,如果大小写匹配类型,则将对象推送到数组。有更优雅的解决方案吗?

3 个答案:

答案 0 :(得分:2)

var items = {};
var i = 0;

for(i; i < res.length; i += 1){
    var resItem = res[i];
    if(items.hasOwnProperty(resItem.type)){
       items[resItem.type].push({price:resItem.price, id:resItem.id});
    } else {
        items[resItem.type] = [{price:resItem.price, id:resItem.id}];
    }
}

JavaScript对象的属性经过哈希处理,因此您可以动态匹配并生成上述新对象。如果要应用井订单排序,则需要将其应用于新生成的项目对象的数组。

答案 1 :(得分:0)

第1步: 将JSON转换为jquery对象:

var x = jQuery.parseJSON( jsonString );

第2步: 使用underscore库的_.groupBy进行分组:

_.groupBy(x,'type');

对于x是数组或对象,可能需要进行一些调整。

编辑: 你不需要step1。只是做:

sorted = _.groupBy(json.res,'type');

答案 2 :(得分:0)

你可以用ECMA5做这样的事情。这通常会执行您在问题中指出的sortreduce,因此您可以向数据中添加更多字段,而无需更改例程。它还保留原始数据。

的Javascript

var original = {
    'res': [{
            'type': 'stream',
            'price': '3.99',
             'id': '13nee'
        }, {
            'type': 'stream',
            'price': '2.99',
            'id': '8ejwj'
        }, {
            'type': 'buy',
            'price': '3.99',
            'id': '9akwk'
        }]
    },
    sorted = {};

original.res.slice().sort(function (a, b) {
    a = +(a.price);
    b = +(b.price);

    if (a < b) {
        return -1;
    }

    if (a > b) {
        return 1;
    }

    return 0;
}).reduce(function (acc, element) {
    if (!acc[element.type]) {
        acc[element.type] = [];
    }

    acc[element.type].push(Object.keys(element).filter(function (name) {
        return name !== 'type';
    }).reduce(function (prev, name) {
        prev[name] = element[name];

        return prev;
    }, {}));

    return acc;
}, sorted);

console.log(JSON.stringify(sorted));

输出

{
    "stream": [{
        "price": "2.99",
        "id": "8ejwj"
    }, {
        "price": "3.99",
        "id": "13nee"
    }],
    "buy": [{
        "price": "3.99",
        "id": "9akwk"
    }]
}

jsFiddle