2014-01-21 2 views
0

Скажем, я извлекаю объект JSON с информацией о пользователе. Одна из частей информации, которую я возвращаю, - это код, указывающий на их любимые фрукты.Извлечение данных из объекта данных js

Так что я userData.faveFruit и я знаю, что его значение будет APP (яблоко), BAN (банан), CHE (вишня), или KIW (Киви). Мне нужно поместить данные на страницу с подробной информацией о любимых фруктах пользователя.

Так что я создал этот объект данных:

var fruitDefinitions = [ 
    { "APP" : [ "Apple", "Red, green or yellow skin, round, white flesh, hard core with seeds." ] }, 
    { "BAN" : [ "Banana", "Thick yellow skin, elongated curved cylinder tapered at both ends, white flesh." ] }, 
    { "CHE" : [ "Cherry", "Red skin and flesh, round, green stem, single inedible pit." ] }, 
    { "KIW" : [ "Kiwi", "Brown furry skin, oval, green flesh, many small edible seeds." ] }, 
]; 

Так как же я иду от того CHE, чтобы быть в состоянии вытащить Cherry и его описание? Похоже, это должно быть довольно просто, но каждая попытка, которую я делаю, просто не работает. Должен ли я строить fruitDefinitions иначе?

Спасибо.

+1

Ваш объект определения фруктов не является особенно хорошей структурой для этой проблемы. Рассмотрим нечто большее, чем 'var fruit = [{code:" CHE ", имя:" Cherry ", описание:" Red skin ... "}, {code:" APP ", имя:" Apple ", описание:" red , green .... "}];', тогда вы можете использовать разумно чистые фильтры/карты/уменьшить вызовы для выполнения большинства интересных видов запросов. Если быстрый поиск по коду является самым важным, переместите код в ключ одного объекта карты определений или создайте индекс (один оператор сокращения сделает трюк). – kybernetikos

ответ

1

Используйте .filter метод:

Пример использования различных данных:

var matches = [ { foo : 'bar' }, { zoo : 'zar' } ].filter(function(item) { 
    return item.hasOwnProperty('zoo'); 
}); 

console.log(matches[0]) // should be { zoo : 'zar' } 

Вы также можете просто сохранить свой объект, как это:

var fruitDefinitions = { 
    "APP" : [ "Apple", "Red, green or yellow skin, round, white flesh, hard core with seeds." ] , 
    "BAN" : [ "Banana", "Thick yellow skin, elongated curved cylinder tapered at both ends, white flesh." ] , 
    "CHE" : [ "Cherry", "Red skin and flesh, round, green stem, single inedible pit." ] , 
    "KIW" : [ "Kiwi", "Brown furry skin, oval, green flesh, many small edible seeds." ] , 
}; 

так что вы можете получить доступ к данным, как это : fruitDefinitions['BAN']

0

Это ju st a foreach петля. Не используйте цикл foreach для массива.

Использовать метод Array.filter как предлагает lxe.

+0

Не используйте петлю for..in с массивами! – lxe

+0

Ups, я просто видел фигурные скобки –

2

Я хотел бы предложить несколько рефакторинга ваши данные:

var fruitDefinitions = { 
    "APP" : [ "Apple", "Red, green or yellow skin, round, white flesh, hard core with seeds." ], 
    "BAN" : [ "Banana", "Thick yellow skin, elongated curved cylinder tapered at both ends, white flesh." ], 
    "CHE" : [ "Cherry", "Red skin and flesh, round, green stem, single inedible pit." ], 
    "KIW" : [ "Kiwi", "Brown furry skin, oval, green flesh, many small edible seeds." ] 
}; 

для использования как так:

console.log(fruitDefinitions.CHE[0]); // Cherry 
console.log(fruitDefinitions.CHE[1]); // Red skin and flesh, round, green stem, single inedible pit. 
0

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

function findfavFruit(fCode) { 
    for (var n = 0, n < fruitDefinitions.length; n++) { 
      if (typeof fruitDefinitions[n][fCode] != undefined) 
       return fruitDefinitions[n][fCode]; 
    } 
    return null; 
} 

это вернет массив

[ "Cherry", "Red skin and flesh, round, green stem, single inedible pit." ]

для "CHE"

-1

Доступ для fruites имя

fruitDefinitions[0]['APP'][0] 

Доступ для fruites описания

fruitDefinitions[0]['APP'][1] 

Если ваш входной динамический, то вы можете сделать ниже код для фруктов имя и описание соответственно.

fruitDefinitions[0][input][0] 

и

fruitDefinitions[0][input][1] 

И

Когда ваш массив fruitDefinitions более одного значения, то не было бы порядковый номер массива вместо «0», что означает ваша структура будет

 fruitDefinitions[i]['APP'][1] 
     ...... 

Здесь 'i' является индексом номер массива

Но было бы хорошо, если бы stucture будет, как LXE сказал

+0

Его массив объектов, а не объект. –

+0

@ Аксель сейчас все в порядке? –

+0

Нет. Откуда вы знаете, что это 0, а не 872367648? –

0

Если вы действительно хотите, чтобы реорганизовать, что полностью, уйти от thatJSON вещи и сделать полный дизайн OO, он на самом деле плачет, что :

var fruit = function(code, name, desc) { 
    this.name = name; 
    this.code = code; 
    this.description = desc; 

    this.getName = function() { return this.name } 
    .... 
} 

var fruits = function() { 

    this.fav = [] 
    this.add = function(name, desc, code) { 
     var f = new fruit(code, name, desc); 
     this.fav.push(f); 

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