根据另一个的顺序对数组进行排序

时间:2011-08-26 15:33:40

标签: javascript arrays sorting scope

我有一个包含数据对象的数组:

[{height: '5 feet'}, {name: 'john'}, {'hair-color': 'brown'}]

另一个按照这些对象应该遵循的顺序:

['name', 'height', 'hair-color']

因此,为了对第一个数组进行排序,我试图使用sort方法,该方法一次比较两个数组元素,并根据一个标准确定哪个应首先排序,我的每个对象的键出现在第二阵列。问题是sort方法使用的回调只传递了两个元素,所以我无法将它们与第二个数组中的任何内容进行比较,因为它超出了回调的范围。非常感谢您的任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

这是一个可以做到这一点的功能。我必须说你的第一个数据结构有点奇怪,因为没有简单的方法来获取第一个数组中每个对象的密钥。但是,我采用了一种时髦的方式来做到这一点并确实排序:

var source = [{height: '5 feet'}, {name: 'john'}, {'hair-color': 'brown'}];
var desiredOrder = ['name', 'height', 'hair-color'];

function sortBy(src, order) {

    // assumes both src and order are the same length and every item in source has a
    // matching item in order and there are no empty objects in src

    // this is a funky function who's job it is to find the first key in the
    // object.  Why the OP used a data structure like this, I have no idea!
    // It makes no sense to me because it's next to impossible to use in real life
    function findKey(obj) {
        for (var i in obj) {
            if (obj.hasOwnProperty(i)) {
                return(i);
            }
        }
    }

    // make an object that has each of the keys in it with the sort order as the value
    var sortHash = {};
    var i;
    for (i = 0; i < order.length; i++) {
        sortHash[order[i]] = i;
    }

    var result = new Array(src.length);
    var key;
    for (i = 0; i < src.length; i++) {
        key = findKey(src[i]);
        result[sortHash[key]] = src[i];
    }
    return(result);
}

var result = sortBy(source, desiredOrder);

你可以在这里看到它:http://jsfiddle.net/jfriend00/Y8xnY/