JavaScript Сортирует массив, но синхронизирует второй массив - PullRequest
4 голосов
/ 21 июня 2011

Я пытаюсь отсортировать один массив, но второй массив синхронизируется с первым.

Пример:

var a1 = ["human", "animal", "plant"];
var a2 = ["person", "beast", "nature"];

a1.sort();

После сортировки мне нужно, чтобы массивы выглядели какэто:

a1 = ["animal", "human", "plant"];
a2 = ["beast", "person", "nature"];

Есть ли простой способ сделать это, может быть, с помощью пользовательской функции сортировки?

Ответы [ 3 ]

4 голосов
/ 21 июня 2011

Вы можете сжать массивы перед сортировкой и разархивировать их после сортировки:

var a = ["human", "animal", "plant"],
    b = ["person", "beast", "nature"],
    zipped = [];

// zip
for (var i=0; i<a.length; i++)
{
    zipped.push({a: a[i], b: b[i]});
}

zipped.sort(function (x, y)
{
    return x.a - y.a;
});

// unzip
var z;
for (i=0; i<zipped.length; i++)
{
    z = zipped[i];
    a[i] = z.a;
    b[i] = z.b;
}

... но я думаю у @ duffymo есть лучшее предложение для вас. Используйте объект / хэш / ассоциативный массив / карту.

var a = [{key: 'human',  value: 'person'},
         {key: 'animal', value: 'beast'},
         {key: 'plant',  value: 'nature'}];

a.sort(function (x, y)
{
    return x.key - y.key;
});
3 голосов
/ 21 июня 2011

Попробуйте что-то вроде этого (не проверено):

a1.sort(function(a, b) {
    if (a > b) {

        // swap a2[0] and a2[1]
        var tmp = a2[0];
        a2[0] = a2[1];
        a2[1] = tmp;

        return 1
    } else if (a < b) {
        return -1
    } else {
        return 0
    }
});

Live DEMO

Что-то в этом роде, поиграйте с возвращаемыми значениями, чтобы сделать его идеальным

1 голос
/ 21 июня 2011

Я бы использовал ассоциативный массив и отсортировал ключи. Вот что у тебя здесь. Я думаю, что ассоциативный массив - лучшее воплощение идеи.

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