如何在JavaScript中基于数组中对象的属性对数组进行排序

时间:2014-06-16 03:30:49

标签: javascript arrays node.js sorting object

我有一个数组,它以下列格式包含很多对象:

var data = [
  {
    vs: "23434",
    ip: "129.23.321.5"
  },
  {
    vs: "23454",
    ip: "129.23.321.6"
  },
  {
    vs: "23434",
    ip: "129.23.321.8"
  }
];

现在我想以一种方式对它们进行排序,其中有一个数组以下列格式保存对象:

var dataFinal = [
  {
    vs: "23434",
    ip: ["129.23.321.5", "129.23.321.8"]
  }
  {
    vs: "98647",
    ip: ["129.23.321.6"]
  }
];

基本上,数据var中将有多个对象,其中可能存在多个ip,而我希望以一种数组将具有多个对象的方式对它们进行排序,每个对象各一个,但是ip将是另一个包含该vs的所有ip的数组。

在javascript中执行此操作的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

我认为这是一种与特定语言无关的编程技术问题。

Javascript不提供" native"做这种任务的方法。你在评论中描述的方式完全没问题。如果您发现自己经常处理这类任务,可以使用某些第三方库(如underscore)来减少生物代码。

解决此问题的强硬方式:

function mergeVsUseUnderscore(data) {
    var dataFinal = [],
    vsInFinal;

    _.each(data, function(item) {
        vsInFinal = _.find(dataFinal, function(itemFinal) {
            return itemFinal.vs === item.vs;
        });

        if(vsInFinal) {
            vsInFinal.ip.push(item.ip);
        } else {
            dataFinal.push({
                vs: item.vs,
                ip: [item.ip]
            })
       }
    });

    return dataFinal;
}

还有一点需要注意,只需使用_.groupBy(data, 'vs')即可生成:

{ 
    '23434': [ 
        { vs: '23434', ip: '129.23.321.5' },
        { vs: '23434', ip: '129.23.321.8' } 
    ],
    '23454': [ { vs: '23454', ip: '129.23.321.6' } ] 
}

答案 1 :(得分:1)

var data = [{
    vs: "1",
    ip: "129.23.321.6"
}, {
    vs: "2",
    ip: "129.23.321.8"
}, {
    vs: "0",
    ip: "129.23.321.5"
}, ];

var transformed = data.reduce(function (memo, datum) {

    var filterFunc = function (_datum) {

        return datum.vs === _datum.vs;

    };

    if (!memo.some(filterFunc)) {

        memo.push({
            vs: datum.vs,
            ip: [datum.ip]
        });

    } else {

        memo.filter(filterFunc)[0].ip.push(datum.ip)

    }

    return memo;

}, []);

var sorted = transformed.sort(function (a, b) {

    if (a.vs > b.vs) {

        return 1;

    } else if (a.vs < b.vs) {

        return -1;

    } else {

        return 0;

    }

});

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

Fiddle