2015-12-22 4 views
2

У меня есть массив идентификаторов в определенном порядке:Упорядочивание объекта на основе массива

var messages = ["13","4","1","9"] 

И тогда у меня returndata, который возвращается по ID по возрастанию над.

var returndata = [{"id":"1","title":"title 1"}][{"id":"4","title":"title 4"}][{"id":"9","title":"title 9"}][{"id":"13","title":"title 13"}] 

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

Как это сделать в javascript или jquery?

Я думал о том, чтобы делать что-то вроде ниже, но он не работает так, как планировалось.

var newData = $.map(messages, function(i, id){ 
     var match = $(returndata).find("[id='"+id+"']"); 
     return match || null; 
}); 
+3

Это не допустимые данные о возврате (хотя и не действительные js). – nicael

+0

@nicael hm, но это то, что мой console.log (JSON.stringify (returndata)) выплескивается – Mike

+1

Опять же, недействительно. Это может быть нечто вроде '[{" id ":" 1 "," title ":" title 1 "}, {" id ":" 4 "," title ":" title 4 "}, {" id ": «9», «title»: «title 9»}, {"id": "13", "title": "title 13"}] '. – nicael

ответ

3

Попробуйте это, оно будет работать, если данные похожи на [{"id":"1","title":"title 1"},{"id":"4","title":"title 4"},{"id":"9","title":"title 9"},{"id":"13","title":"title 13"}].

returndata .sort(function(x,y){ 
    return x.id - y.id; 
}); 
+0

thnx для редактирования @ nicael – Tanmay

+0

Он не хочет, чтобы элементы отсортировались по возрастанию. Он хочет, чтобы элементы упорядочивались в соответствии с массивом значений «id».Фактически OP говорит, что элементы * уже * отсортированы по значению «id» в порядке возрастания. – Pointy

+0

Да, вы правы, на самом деле он не ясен .... позвольте мне попробовать это, чтобы снова поблагодарить – Tanmay

0

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

returndata.sort(function(a, b){ 
    var ax = parseInt(a.title.substring(7)); 
    var bx = parseInt(b.title.substring(7)); 
    return ax - bx; 
} 
+0

Не желая отменить заказ. Я ищу, чтобы прибегнуть к услугам на основе порядка идентификаторов в сообщениях. – Mike

+0

О, ID. Это было для номера заголовка ... –

+0

Ну, решение @ Tanmay выше, это правильное ... –

2

Если данные являются реальным массивом, вы можете отсортировать его с заданным типом сортировки.

Update

Повышение производительности без indexOf().

var messages = ["13", "4", "1", "9"], 
 
    returndata = [{ "id": "1", "title": "title 1" }, { "id": "4", "title": "title 4" }, { "id": "9", "title": "title 9" }, { "id": "13", "title": "title 13" }], 
 
    map = messages.reduce(function (r, a, i) { r[a] = i; return r; }, {}); 
 

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

 
document.write('<pre>' + JSON.stringify(returndata, 0, 4) + '</pre>');

+0

Это будет работать, но все вызовы '.indexOf()' будут складываться, если массив длинный. Если на самом деле у него есть только три или четыре элемента, это, конечно же, не имеет значения. – Pointy

+0

@Pointy, поможет сортировать с картой. –

+0

Я не уверен, что понимаю, что это значит. – Pointy

0

Вы на самом деле не нужно рода вообще. Пройдите через возвращаемый массив и создайте новое сопоставление объектов из значения «id» в запись. Вы можете сделать это с .reduce():

var idMap = returndata.reduce(function(m, elem) { 
    m[elem.id] = elem; 
    return m; 
}, {}); 

Это начинается с пустым объектом и заполнит его свойство для каждого элемента в массиве returndata. Именование свойства - это свойство свойства id, а значение - это сам элемент.

Затем вы можете произвести правильно упорядоченный массив с .map():

var correctOrder = messages.map(function(id) { 
    return idMap[id]; 
}); 

Это перебирает ваш messages массив, выщипывание элемент с указанным идентификатором «» и вернуть его. API .map() возвращает массив, состоящий из всех возвращаемых значений.