2015-02-08 3 views
0

Я пытаюсь сортировать все элементы в массиве items, чтобы следовать порядку, указанному в string. Я пытаюсь получить results бытьСортировка массива в соответствии с заданным порядком

["first", "second", "third", "last"] 

после сортировки. Начальный массив имеет рандомизированный порядок.

var string = "first;second;third;last", 
 
    items = ["third", "first", "last", "second"], 
 
    result = [], 
 
    lastpos = 0, 
 
    lastinsert = 0; 
 

 
for (var i = 0; i < items.length; i++) { 
 
\t var mypos = string.indexOf(items[i]), 
 
\t  insertat; 
 
\t if (mypos > lastpos) { 
 
\t \t insertat = lastinsert 
 
\t } else { 
 
\t \t insertat = lastinsert + 1 
 
\t } 
 
\t result.splice(insertat, 0, items[i]); 
 
\t lastpos = mypos; 
 
} 
 

 
document.getElementById("output").innerHTML = JSON.stringify(result);
<pre id="output"></pre>

Я не просить, чтобы иметь анализ текста для сортировки массива. Массив должен просто следовать порядку элементов в переменной string.

+0

Я понятия не имею, что вы спрашиваете – bencripps

+0

То же самое. Можете ли вы повторно написать свой фрагмент, используя имена, которые будут иметь смысл? Извините, мне просто сложно отслеживать «a: first», «b: last» и т. Д. – Eclecticist

+0

Я все равно запутаюсь. «Элементы» содержат точно такой же набор значений, что и «строка»? Если да, то зачем вообще разбираться? Просто используйте 'string'. BTW, Javascript имеет метод 'sort' на' Array.prototype'. –

ответ

2

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

Вы можете попробовать использовать Array.prototype.sort() с чем-то вроде этого:

var string = "first;second;third;last".split(';'), 
    items = ["third", "first", "last", "second"], 
    result = []; 

result = items.sort(function(a,b) { 
    return string.indexOf(a) - string.indexOf(b) 
}); 

document.getElementById("output").innerHTML = JSON.stringify(result); 

Вот JSFiddle пример.

--edit--

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

var string = "first;second;third;last".split(';'), 
    stringHash = {}, 
    items = ["third", "first", "last", "second"], 
    result = [];  

for (var i = 0, j = string.length; i < j; i++) { 
    stringHash[string[i]] = i; 
} 

result = items.sort(function(a,b) { 
    return stringHash[a] - stringHash[b]; 
}); 

document.getElementById("output").innerHTML = JSON.stringify(result); 

Вы будете добавлять в дополнительном шаге, поэтому если исходные массивы малы, может не стоить того. Если массивы больше, тем не менее, это будет значительно лучше.

+0

Да, спасибо! Это делает именно то, что мне нужно. – aNewStart847

+0

Имейте в виду, что если ваши реальные массивы действительно большие, это будет * очень медленно. – Eclecticist

+0

Есть ли альтернатива, которая лучше работает с большими массивами?Наверное, нет, так как это настраиваемый алгоритм сортировки. – aNewStart847

0

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

var string = "a:test;a:second;b:third;a:last"; 
 
var result = string.split(';');

Или есть некоторое преобразование выполняется на данных, которые не изображенные на фрагменте там, что на самом деле требует, чтобы вы отмените сортировки существующих элементы массива?

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