2013-07-27 2 views
0

Хорошо, поэтому у меня есть массив результатов поиска объектов, где одно из значений свойств объекта (показать значение) соответствует поиску. Структура этого массива следующим образом и может содержать любое количество различных объектов:Как создать переменные ключи объектов из объектных ключей объектов?

results = [ 
    { 
     day: value, 
     time: value, 
     show: value, 
     sid: value, 
     network: value, 
     title: value, 
     ep: value, 
     link: value, 
    } 
]; 

Я пытаюсь объединить все результаты в один большой объект, сливаясь любые дни или времена, которые имеют одинаковое значение. Однако я не могу просто смотреть каждый день или время независимо. Например, мне нужно сохранить 9:00 вечера в понедельник, если во вторник будет 9:00 вечера.

Для этого я пытаюсь создать новую структуру объекта следующим образом:

for (var i=0; i<results.length; i++) { 
    var uniqtime = results[i]["time"]; 
    var uniqshow = results[i].show; 
    uniqresults[results[i].day] = { 
     uniqtime: { 
      uniqshow: { 
       sid: results[i].sid, 
       network: results[i].network, 
       title: results[i]["title"], 
       ep: results[i].ep, 
       link: results[i]["link"] 
      } 
     } 
    }; 
} 

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

Если я вместо этого попытаться создать переменные подобъекты/ключи так:

for (var i=0; i<obj.length; i++) { 
    uniqresults[results[i].day] = {}; 
    uniqresults[results[i].day][results[i]["time"]] = {}; 
    uniqresults[results[i].day][results[i]["time"]][results[i].show] = { 
     sid: obj[i].sid, 
     network: results[i].network, 
     title: results[i]["title"], 
     ep: results[i].ep, 
     link: results[i]["link"] 
    }; 
} 

Я действительно создать соответствующие ключевые имена, но я вынужден объявить пустой объект для определения каждого ключа (uniqresults[obj[i].day] = {} & uniqresults[obj[i].day][obj[i]["time"]] = {}). Если я не объявлю подобное, это не позволит мне вставить другие под-ключи/значения, которые мне нужны. Однако объявление такого типа не позволяет мне правильно объединять массивы результатов, так как я по существу опустошаю имена под-ключей каждый раз, когда я читаю новый объект результата!

Возможно, я делаю это более сложным, чем должно быть. Возможно, есть более простой способ или способ подчеркнуть или jquery может упростить мою задачу под рукой. Несмотря на это, я сейчас очень отчаянно нуждаюсь в правильном решении.

ответ

2

Похоже, вы могли использовать условную проверку при переделке этих объектов.

var day, time; 
for (var i=0; i<obj.length; i++) { 
    // Instantiate the day reference if it doesn't exist 
    day = uniqresults[results[i].day] = uniqresults[results[i].day] || {}; 

    // Instantiate the time reference if it doesn't exist 
    time = day[results[i].time] = day[results[i].time] || {}; 

    time[results[i].show] = { 
     sid: obj[i].sid, 
     network: results[i].network, 
     title: results[i]["title"], 
     ep: results[i].ep, 
     link: results[i]["link"] 
    }; 
} 

Cheers!

+0

Хорошее использование промежуточных переменных, чтобы избежать длительного доступа вложенных массивов. – IMSoP

0

Создайте пустой объект, только если ключ объекта не существует:

if(!(results[i].day in uniqresults)){ 
    uniqresults[results[i].day] = {}; 
} 

И для суб ключей так далее.

2

Я не знаю, есть ли более четкое решение более широкой проблемы, но проблема перезаписи под-объектов каждый раз может быть решена путем проверки, существуют ли они уже до их создания.

Относительно компактный и идиоматический способ сделать это в JS используют || оператор, который в отличии от большинства языков возвращает аргумент, оцененную истину, а не просто логическое true:

uniqresults[results[i].day] = uniqresults[results[i].day] || {}; 

Первый раз через , uniqresults[results[i].day] будет неопределенным, поэтому оцените значение false, поэтому будет назначено {}; впоследствии, однако, это будет объект, который оценивает значение true, поэтому просто присвойте переменную самому себе, оставив ее неизменной.

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