【问题标题】:javascript objects sorting by arrayjavascript对象按数组排序
【发布时间】:2019-07-16 13:54:19
【问题描述】:

有没有办法对结构中的对象数组进行排序:

var objs = [{
    "name": "B",
    "value": 1
}, {
    "name": "D",
    "value": "45"
}, {
    "name": "E",
    "value": "234"
}, {
    "name": "A",
    "value": "543"
}, {
    "name": "C",
    "value": "250"
}, {
    "name": "B",
    "value": 6
}, {
    "name": "D",
    "value": "234"
}, {
    "name": "E",
    "value": "67"
}, {
    "name": "A",
    "value": "78"
}, {
    "name": "C",
    "value": "12"
}];

通过另一个数组中的元素:

var orderedArray = ["E", "C", "B", "A", "D"];

为了得到这样的结构:

    {
            "name": "E",
            "value": "234"
        },
    {
            "name": "C",
            "value": "250"
        },
    {
            "name": "B",
            "value": 1
        },
{
        "name": "A",
        "value": "543"
    },
{
        "name": "D",
        "value": "45"
    },
{
        "name": "E",
        "value": "67"
    },
{
        "name": "C",
        "value": "12"
    },
{
        "name": "B",
        "value": 6
    },
{
        "name": "A",
        "value": "78"
    },
{
        "name": "D",
        "value": "234"
    }

我正在尝试按名称键的索引使用 sort() 函数:

var objs = [{ "name": "B", "value": 1 }, { "name": "D", "value": "45" }, { "name": "E", "value": "234" }, { "name": "A", "value": "543" }, { "name": "C", "value": "250" }, { "name": "B", "value": 6 }, { "name": "D", "value": "234" }, { "name": "E", "value": "67" }, { "name": "A", "value": "78" }, { "name": "C", "value": "12" }];

var orderedArray = ["E", "C", "B", "A", "D"];
var sorted = objs.sort((a, b) => orderedArray.indexOf(a.name) - orderedArray.indexOf(b.name));
console.log(sorted);

但结果的顺序不正确。

示例:jsfiddle

【问题讨论】:

  • 订单有什么问题?它看起来与您的orderedArray 指定的确切顺序完全相同。 编辑:请注意,我还将您的代码制作成可运行的内联 sn-p。
  • 你能给我们更多你的预期输出吗?您显示了一个 E,然后是一个 C,然后是一个 B。但是每个都有多个,那么其他应该在哪里?
  • 他们昨天问了同样的问题
  • @Kobe 昨天的问题似乎相关但不一样。
  • 您的排序似乎完全是任意的。你想达到什么目的?

标签: javascript arrays sorting javascript-objects


【解决方案1】:

您可以使用sorting with map 并获取组和顺序以获得序列排序。

var array = [{ name: "B", value: 1 }, { name: "D", value: "45" }, { name: "E", value: "234" }, { name: "A", value: "543" }, { name: "C", value: "250" }, { name: "B", value: 6 }, { name: "D", value: "234" }, { name: "E", value: "67" }, { name: "A", value: "78" }, { name: "C", value: "12" }],
    order = ["E", "C", "B", "A", "D"],
    groups = Object.create(null),
    result = array
        .map((o, i) => ({ index: i, order: order.indexOf(o.name), group: groups[o.name] = (groups[o.name] || 0) + 1 }))
        .sort((a, b) => a.group - b.group || a.order - b.order)
        .map(({ index }) => array[index]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2011-09-06
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2019-11-24
    相关资源
    最近更新 更多