【问题标题】:How to sort array based on property of an object in the array in JavaScript如何根据JavaScript中数组中对象的属性对数组进行排序
【发布时间】:2014-08-05 20:12:28
【问题描述】:

我有一个数组,其中包含以下格式的许多对象:

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

所以基本上,数据变量中将有多个对象,其中可能有多个具有相同 vs 的 ip。我想以数组将有多个对象的方式对它们进行排序,每个对象一个对象,但是ip 将是另一个数组,其中包含该 vs 的所有 ip。

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

【问题讨论】:

  • 您的意思是“可能有多个 ip 具有相同的 vs”吗?
  • @merlin 是的,感谢您的关注。我已经更新了帖子。
  • 你试过什么?看来reducesort 的某种组合应该可以工作。
  • @pdoherty926 到目前为止,我已经尝试创建一个临时对象并循环遍历数据变量以查找具有相同 vs 的其他对象并获取所有 ip 并将其添加到临时对象中。一旦循环完成,它会将对象推送到 dataFinal 数组,然后对下一个执行相同的操作。这确实有效,但我觉得这不是正确的方法。谢谢你的建议,我会看看reduce和sort
  • 尝试使用 underscore.js 之类的 _.groupBy(data, 'vs')

标签: javascript arrays node.js sorting object


【解决方案1】:

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

Javascript 不提供执行此类任务的“本地”方式。你在评论中描述的方式完全没问题。如果您发现自己经常处理这类任务,您可以使用一些第三方库,如 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' } ] 
}

【讨论】:

  • 谢谢,我最终使用了_.groupBy
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多