按定义顺序排序数组

时间:2019-02-13 12:51:58

标签: javascript arrays

我已经尝试了几种答案,但似乎没有任何效果。我正在处理一些数据并将其放置在数组上。为此,我有以下

let aggData = [];

for (let i = 0; i < data.length; i++) {
    let flag = data[i]['Category'].replace(/[_]/g, " ");
    flag = flag.toLowerCase()
        .split(' ')
        .map((s) => s.charAt(0).toUpperCase() + s.substring(1))
        .join(' ');

    aggData.push({
        "Flag": flag,
        "Freq": data[i]['Count']
    });
}
console.log( JSON.stringify( aggData ) );

上面的输出如下

[
    {"Flag":"Four","Freq":123},
    {"Flag":"One","Freq":234},
    {"Flag":"Three","Freq":345},
    {"Flag":"Two Days","Freq":456}
]

因此,看起来自然是根据字母顺序对其进行排序。我需要按照定义的顺序进行操作,更具体地来说,

let order = ["Three", "One", "Two Days", "Four"];

let arr = aggData.sort(function(a,b) {
    return order.indexOf( a.key ) > order.indexOf( b.key );
});

console.log( 'Ordered: ', JSON.stringify( arr ) );

以上内容返回的顺序与之前完全相同。如何按我需要的方式订购它?

谢谢

2 个答案:

答案 0 :(得分:2)

您需要获取正确的属性Flag并采用增量而不是布尔值。

顺便说一句,Array#sort对数组进行了突变。

var aggData = [{ Flag: "Four", Freq: 123 }, { Flag: "One", Freq: 234 }, { Flag: "Three", Freq: 345 }, { Flag: "Two Days", Freq: 456 }],
    order = ["Three", "One", "Two Days", "Four"];

aggData.sort(function (a, b) {
    return order.indexOf(a.Flag) - order.indexOf(b.Flag);
});

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

答案 1 :(得分:1)

您需要做的就是正确使用sort,返回一个数字而不是一个布尔值……当然要使用正确的属性……

let data = [
    {"Flag":"Four","Freq":123},
    {"Flag":"One","Freq":234},
    {"Flag":"Three","Freq":345},
    {"Flag":"Two Days","Freq":456}
]


let order = ["Three", "One", "Two Days", "Four"];

let arr = data.sort(function(a,b) {
    return order.indexOf( a.Flag ) - order.indexOf( b.Flag );
});

console.log( 'Ordered: ', JSON.stringify( arr ) );