2016-08-16 2 views
2

У меня есть объект, который выглядит следующим образом:Получить соответствующее значение в объекте с идентификатором

var cities = { 

     "LA": [ 
     {id:1, description:"This is a test"}, 
     {id:3, description:"This is a third test"}, 
     ], 

     "Chicago": [ 
     {id:2, description:"This is another test"} 
     ], 

     "Vegas": [ 
     {id:4, description:"This is another test"}, 
     {id:5, description:"This is a fifth test"}, 
     {id:6, description:"This is the last test"}, 
     ] 
} 

Учитывая идентификатор я хочу найти соответствующее описание.

Так, например, если бы мне дали id 1 Я хотел бы вернуть this is a test. Если бы мне дали id 5, он вернул бы This is a fifth test

Кто-нибудь знает, как это можно сделать, используя vanilla js, или используя lodash или подчеркивание?

+0

Что конкретно вы возникают проблемы с? Вы знаете, как перебирать массивы и объекты? –

+1

Это не хорошая структура для этого. Если вы захотите сделать это несколько раз, я просто сделаю объект поиска. – Amadan

+0

@Amadan объект возвращается из вызова API. Felix, я не уверен на 100%, как перебирать массив, поскольку он каждый раз различается по длине. –

ответ

3
var item = [].concat(...Object.values(cities)).find(o => o.id == 2) 
item && item.description 
// => "This is another test" 

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

lookup = {} 
Object.values(cities).forEach(a => a.forEach(e => lookup[e.id] = e)) 
lookup[2].description 
// => "This is another test" 
lookup[3].description 
// => "This is a third test" 

(Обратите внимание, что этот ответ использует синтаксис ES6, но его легко преобразовать в ES5, если вам нужна более старая поддержка браузера.)

+0

WOW! Хороший! Это нереально! –

+1

Если вы пишете ES6, почему бы не '[] .concat (...'? –

+0

@torazaburo: потому что derp :) Спасибо. Я не использовал все это еще достаточно, чтобы использовать его естественным, и старые шаблоны заглядывают им в голову. – Amadan

0

Здесь используется JQuery

for (var city in cities) { 
    if (cities.hasOwnProperty(city)) { 
    $.each(cities[city] , function(i, item) { 
     if(item.id == 1) { 
      console.log(item.description); 
     } 
    }); 
    } 
} 
+0

Где тег jQuery в этом вопросе? – Nick

0

объект петля с for in и массив петля с forEach

function findById(d){ 
    var result; 
    for(var k in cities){ 
       cities[k].forEach(function(v){ 
        if(v.id == d) result = v.description; 
       }); 
    } 
    return result; 
} 
console.log(findById(5));