Сортировка массива по порядку другого - PullRequest
1 голос
/ 26 августа 2011

У меня есть один массив с объектами данных:

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

И другой с порядком, в котором должны следовать эти объекты:

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

Итак, чтобы отсортировать первый массив, я пыталсяиспользуйте метод sort, который сравнивает элементы массива по два за раз и определяет, какие из них должны быть упорядочены первыми, на основе критерия, в котором мой порядок соответствует ключу каждого объекта во втором массиве.Проблема в том, что обратный вызов, используемый методом сортировки, передается только двум элементам, поэтому я не могу сравнить их ни с чем во втором массиве, потому что он находится вне области обратного вызова.Любая помощь с этим будет высоко ценится, спасибо.

1 Ответ

1 голос
/ 26 августа 2011

Вот функция, которая сделает это.Я должен сказать, что ваша первая структура данных немного странная, потому что нет простого способа получить ключ в каждом объекте в этом первом массиве.Но я разработал забавный способ сделать это, и он действительно сортирует:

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/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...