排序数组

时间:2012-08-02 15:11:44

标签: javascript

我有以下数据:

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个哈希表 我需要根据最后一个元素(data [2])中'y'键的值来排序所有哈希表中的元素。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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;
});

答案 2 :(得分:0)

要获得预期结果,您可以使用此算法。它只是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];
    });
};