2013-05-26 5 views
1

Я выполняю итерацию по парам массивов, и мне нужно отсортировать их по порядку другого.Сортировка массива по другому массиву индексов

Скажем, у меня есть эти два массива:

aLinks = [4,5,6] 
bLinks = [1,2,3,4,5,6] 

мне нужно вернуться:

aLinks = [4,5,6] 
bLinks = [4,5,6,1,2,3] 

что означает, что я должен иметь элементы, которые соответствуют первый массив первого и остальных, отсортирован по заказу, если это возможно.

Я работаю с d3, поэтому я использую forEach для прохождения наборов ссылок и сохранения порядка aLinks.

Я не знаю, как применять этот приказ моргает

var linkOrder = []; 

linkSets.forEach(function(set, i) { 
    linkOrder = []; 

    set.aLinks.forEach(function(link,i){ 
    linkOrder.push(link.path); 
    }) 
}); 
+5

Опубликовать код. что ты уже испробовал? – EnKrypt

+2

Опубликовать также немного больше о ваших выгодах. Что должно произойти, если элементы первого массива не находятся внутри второго, или что, если второй содержит один из элементов первого несколько раз? – basilikum

+1

Если первый массив - это '[6, 5, 4]', если второй массив начинается с '[4, 5, 6]' (т. Е. Отсортирован) или '[6, 5, 4]' (совпадающий с порядком в первом массиве). –

ответ

4

Вы можете сделать это нравится:

  1. Выньте элементы соответсвующей из второго массива в виде временного массива
  2. Sort временный секретарь массив
  3. Сортировка второй массив, содержащий только те элементы, которые не соответствуют
  4. сростить второй массив в временный массив

Код - с исправлением предоставленной пользователем: Basilikum

var first = [4,5,6]; 
var second = [1,7,3,4,6,5,6]; 
var temp = [], i = 0, p = -1; 

// numerical comparator 
function compare(a, b) { return a - b; } 

// take out matching items from second array into a temp array 
for(i=0; i<first.length; i++) { 
    while ((p = second.indexOf(first[i])) !== -1) { 
     temp.push(first[i]); 
     second.splice(p, 1); 
    } 
} 

// sort both arrays 
temp.sort(compare); 
second.sort(compare); 

// concat 
temp = temp.concat(second); 
console.log(temp); 

Рабочий демонстрационный пример: http://jsfiddle.net/kHhFQ/

+0

Спасибо! что также решает эту проблему элементов из первого массива, который не сортируется во втором. – BarakChamo

+1

При необходимости: здесь приведена версия скрипта techfoobar, которая обрабатывает несколько записей во втором массиве: http://jsfiddle.net/kHhFQ/1/ – basilikum

+0

@basilikum - Спасибо. Это чистое исправление. Добавьте его к ответу. – techfoobar

2

Вы в конечном итоге с A + sort(A-B) - так что вам просто необходимо вычислить разницу между 2-массивами. Использование некоторых underscore удобных методов, например:

var A = [4,5,6]; 
var B = [1,2,3,4,5,6]; 

var diff = _.difference(A,B); 

var result = _.flattern(A, diff.sort()); 
1

итерацию первый массив, удаление значения из второго массива, а затем добавляя их к началу массива, чтобы получить правильный порядок:

var arr1 = [4,5,6]; 
var arr2 = [1,2,3,4,6,5]; 

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

for (i=arr1.length; i--;) { 
    arr2.splice(arr2.indexOf(arr1[i]), 1); 
    arr2.unshift(arr1[i]); 
} 

FIDDLE

Смежные вопросы