繁体   English   中英

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

[英]Sorting an array based on the order of another

我有一个带有数据对象的数组:

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

另一个带有这些对象应遵循的顺序:

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

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

这是一个可以做到的功能。 我必须说您的第一个数据结构有点奇怪,因为没有简单的方法来获取第一个数组中每个对象中的键。 但是,我想出了一种时髦的方法来做到这一点,并且确实可以:

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM