2016-09-01 3 views
0

У меня есть 2 массивы:NodeJS/JS - сортировка на основе другого массива + движущихся элементов эффективно

var one = ['da22', 'ye66', '17hy'] и

var two = [{publicID: 'da22', score: '2'}, {publicID: '17hy', score: '2'}, {publicID: 'ye66', score: '2'}]

хочу two быть заказан publicID согласно one так оно должно должно быть

two = [{publicID: 'da22', score: '2'}, {publicID: 'ye66', score: '2'}, {publicID: '17hy', score: '2'}]

Есть ли встроенный метод в NodeJS для этого?

У меня это работает, однако его не очень эффективно. У меня есть метод, чем может переместить элемент из одного индекса к другим moveFromTo(oldIndex, newIndex, который я использую с:

for (var r=0; r<one.length; r++) { 
       if (one[r] != two[r]['publicID']) { 
       two.moveFromTo(one.indexOf(two[r]['publicID']), r) 
       r=-1; continue; 
       } 
} 

Но того, чтобы использовать это r=-1 как вещи двигаться - хотя работа - не кажется лучшим из идеи.

Любые идеи будут оценены.

Большое спасибо.

+0

Определите, что вы хотите иметь для объектов в 'two', для которых нет совпадения' publicID' в 'one'. – Makyen

+0

@Makyen - всегда будет подходящий объект – userMod2

+1

@Makyen - typo fixed – userMod2

ответ

1

Вы можете сделать это с sort() и indexOf()

var one = ['da22', 'ye66', '17hy']; 
 
var two = [{publicID: 'da22', score: '2'}, {publicID: '17hy', score: '2'}, {publicID: 'ye66', score: '2'}]; 
 

 
var result = two.sort(function(a, b) { 
 
    return one.indexOf(a.publicID) - one.indexOf(b.publicID); 
 
}) 
 

 
console.log(result)

Вы также можете создать объект из one и сортировать по этому объекту.

var one = ['da22', 'ye66', '17hy']; 
 
var two = [{publicID: 'da22', score: '2'}, {publicID: '17hy', score: '2'}, {publicID: 'ye66', score: '2'}]; 
 

 
var o = one.reduce((r, e, i) => {return r[e]=i, r}, {}); 
 

 
var result = two.sort(function(a, b) { 
 
    return o[a.publicID] - o[b.publicID]; 
 
}) 
 

 
console.log(result)

+0

Назначение 'result' не требуется. ['.sort()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) сортирует массив * на месте *. Кроме того, он возвращает массив. Однако присвоение его 'result' эквивалентно' two.sort (function ...); var result = two; '. – Makyen

+0

Боковое примечание. Если вы ищете скорость, Array.sort() не лучший вариант с большим отрывом. См. Http://stackoverflow.com/questions/38732480/native-javascript-sort-performing-slower-than-implemented-mergesort-and-quicksor –

+0

@PatrickMotard - Максимальное количество элементов в массиве будет 100 - I ' Предполагая, что это будет хорошо? – userMod2

0

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

Чтобы сделать это, вы можете уменьшить two, и для каждого элемента тока функция снижения применяется к, поставить соответствующий элемент two в определенном положении в результате массив (ака total):

const one = ['da22', 'ye66', '17hy']; 
const two = [{ 
    publicID: 'da22', 
    score: '2' 
}, { 
    publicID: 'ye66', 
    score: '2' 
}, { 
    publicID: '17hy', 
    score: '2' 
}]; 

const sortedTwo = two.reduce((total, current) => { 
    total[one.indexOf(current.publicID)] = current; // <- some crazy stuff here 

    return total; 
}, []); 

Марка обязательно publicID значения свойств в two, а значения one - совершенно идентичные наборы.

Скорость и неизменность исходного массива в комплекте.

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