2015-03-19 3 views
0

У меня есть массив строк в определенном порядке и хотел бы упорядочить другой массив объектов в соответствии с порядком первоначального массива.Упорядочить массив объектов по соответствующему массиву строк

var arrangement = ["third", "first" "second"]; 

var myObjs = [ 
    { 
    name: "thing", 
    position: "first" 
    }, 
    { 
    name: "thing", 
    position: "second" 
    }, 
    { 
    name: "thing", 
    position: "third" 
    } 
]; 

Так что результат будет:

var myObjs = [ 
    { 
    name: "thing", 
    position: "third" 
    }, 
    { 
    name: "thing", 
    position: "first" 
    }, 
    { 
    name: "thing", 
    position: "second" 
    } 
]; 

Любые идеи о том, хороший способ приблизиться к этому?

Приветствия,

ответ

4

Использование indexOf функции первого массива на текущих элементах вы сортировочные:

myObjs.sort(function(a, b) { 
    return arrangement.indexOf(a.position) - arrangement.indexOf(b.position); 
}) 
+1

Приятный и простой, но может быть много обработки, если «договоренность» не мала. –

2

Я хотел бы построить карту (объект) заклиненную по position значений из первого массива, с индексом каждой записи в качестве значения; например:

var map = arrangement.reduce(function(obj, value, index) { 
    obj[value] = index; 
    return obj; 
}, {}); 

Тогда я бы использовал Array#sort на myObjs с функцией сравнения, которая просматривает position значения двух записей он дал на map:

myObjs.sort(function(a, b) { 
    return map[a.position] - map[b.position]; 
}); 

Живой пример:

var arrangement = ["third", "first", "second"]; 
 

 
var myObjs = [ 
 
     { 
 
      name: "thing", 
 
      position: "first" 
 
     }, 
 
     { 
 
      name: "thing", 
 
      position: "second" 
 
     }, 
 
     { 
 
      name: "thing", 
 
      position: "third" 
 
     } 
 
    ]; 
 

 
var map = arrangement.reduce(function(obj, value, index) { 
 
    obj[value] = index; 
 
    return obj; 
 
}, {}); 
 

 
myObjs.sort(function(a, b) { 
 
    return map[a.position] - map[b.position]; 
 
}); 
 

 
snippet.log("Result: " + JSON.stringify(myObjs));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

1

Сначала вам нужен «индекс» массив объекта:

var objpos = {}; 
objects.forEach(function(obj, ix) { objpos['!' + obj.name] = ix; }); 

Тогда вы можете построить результат

var result = arrangement.map(function(name) { 
    return objects[objpos['!' + n]]; 
}); 

! - моя привычка всегда добавлять его перед клавишами при использовании obje cts в качестве словарей (чтобы избежать проблем с ключом "constructor").

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