1

我有以下数据:

var data = [[{x:"c", y:10}, {x:"a", y:20}, {x:"b", y:4}], [{x:"c", y:14}, {x:"a", y:22}, {x:"b", y:9}], [{x:"c", y:24}, {x:"a", y:65}, {x:"b", y:46}]]

我需要根据最后一个数组元素的 'y' 属性值对每个数组(在父数组中)的 (x) 元素进行排序。结果将是:

[[{x:"c", y:10}, {x:"b", y:4}, {x:"a", y:20}], [{x:"c", y:14}, {x:"b", y:9}, {x:"a", y:22}], [{x:"c", y:24}, {x:"b", y:46}, {x:"a", y:65}]]

有什么简单的方法可以做到这一点?这是数据的全局结构:

var data = [[{x:"x_1", y:}, {x:"x_2", y:},.. {x:"x_N", y:}], [{x:"x_1", y:}, {x:"x_2", y:},.. {x:"x_N", y:}], [{x:"x_1", y:}, {x:"x_2", y:},.. {x:"x_N", y:}]]

我有一个由 3 个数组组成的数组,每个数组都包含 N 个哈希表。
我需要根据最后一个元素(数据 [2])中的 'y' 键的值对所有哈希表中的元素进行排序。

4

3 回答 3

0
data.sort(function(a,b){return b.y-a.y});

http://www.w3schools.com/jsref/jsref_sort.asp

于 2012-08-02T15:16:25.707 回答
0

我真的看不出如何存档演示结果的样子,但如果你想要你的文字所说的,这将完成这项工作。

ASC

data.sort(function(a, b) {
    return b[b.length-1].y - a[a.length-1].y;
});

DESC

data.sort(function(a, b) {
    return a[a.length-1].y - b[b.length-1].y;
});
于 2012-08-02T15:17:52.713 回答
0

要获得预期的结果,您可以使用此算法。它只是对 in 中所有数组的循环data,并使用常见的sort-by-function 对它们进行排序:

for (var i=0; i<data.length; i++)
    data[i].sort(function(a, b) {
        return (a.x < b.x) - (b.x < a.x);
    });

> JSON.stringify(data)
[[{"x":"c","y":10},{"x":"b","y":4},{"x":"a","y":20}],[{"x":"c","y":14},{"x":"b","y":9},{"x":"a","y":22}],[{"x":"c","y":24},{"x":"b","y":46},{"x":"a","y":65}]]

请注意,它不是您试图描述的内容,而是按x属性反向排序。


编辑:现在我得到了任务。这是算法:

// get the last element and sort it
var last = data[data.length-1];
last.sort(function(a,b){ return a.y-b.y; });

// get the sort order:
var order = last.map(function(o){ return o.x; }); // ["c", "b", "a"]

// now, reorder the previous arrays:
for (var i=0; i<data.length-1; i++) { // sic: loop condition is correct!
    // create a map for the items by their x property
    var hash = data[i].reduce(function(map, o){
        map[o.x] = o;
        return map;
    }, {});
    // create the new array by mapping the order
    data[i] = order.map(function(x) {
        return hash[x];
    });
};
于 2012-08-02T18:18:29.550 回答