Как найти член объекта JSON на основе строкового значения

Итак, предположим, что у меня есть файл JSON как таковой:

{ "store": {
"book": [ 
  { "category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": 8.95
  },
  { "category": "fiction",
    "author": "Evelyn Waugh",
    "title": "Sword of Honour",
    "price": 12.99
  },
  { "category": "fiction",
    "author": "Herman Melville",
    "title": "Moby Dick",
    "isbn": "0-553-21311-3",
    "price": 8.99
  },
  { "category": "fiction",
    "author": "J. R. R. Tolkien",
    "title": "The Lord of the Rings",
    "isbn": "0-395-19395-8",
    "price": 22.99
  }
    ]
  }
}

Что я хочу сделать, так это захватить член «книги» и все его пары строковых значений, где заголовок «Меч чести». Как я могу сделать это с помощью JQuery? Проблема в том, что я не знаю идентификатор индекса члена, если бы я знал, это было бы тривиально, т.е. store.book[1].XXX дал бы мне значение всех пар значений ключа одного уровня, которые я ищу за.

Любые идеи о том, как я могу сделать это с минимальным кодом?


person 0pt1m1z3    schedule 19.08.2012    source источник
comment
это не джсон. это чистый объект js. Json — это текстовое представление.   -  person Royi Namir    schedule 20.08.2012
comment
@RoyiNamir на самом деле это является законным JSON - подсказка - это кавычки вокруг ключей. Однако я подозреваю, что OP не нужно знать, как декодировать JSON.   -  person Alnitak    schedule 20.08.2012
comment
@Alnitak Json - это текстовое представление. '{"a":3}' не {"a":3}   -  person Royi Namir    schedule 20.08.2012
comment
На самом деле, я просто .ajax с jsonp в качестве типа данных. Итак, он декодирует JSON в мой JS-код. Я просто хотел включить текстовое представление того, с чем я имел дело, чтобы прояснить свой вопрос.   -  person 0pt1m1z3    schedule 20.08.2012
comment
@RoyiNamir нет, тело JSON, отправленное по HTTP, не требует заключенных в кавычки кавычек. Они нужны вам только в том случае, если вы пишете JSON как строковый литерал.   -  person Alnitak    schedule 20.08.2012
comment
@RoyiNamir приведенный выше код полностью соответствует JSON. Или же я предлагаю вам отредактировать статью JSON в Википедии.   -  person 0pt1m1z3    schedule 20.08.2012
comment
@RoyiNamir, при всем уважении, нет, я не ошибаюсь. Необработанная строка JSON не заключена в кавычки. Строковый литерал JS (который может содержать JSON) делает.   -  person Alnitak    schedule 20.08.2012
comment
@Alnitak мой плохой. (мое недоразумение) извините.   -  person Royi Namir    schedule 20.08.2012


Ответы (2)


Используя массив filter:

var matches = store.book.filter(function(val, index, array) {
    return val.title === 'Sword of Honour';
});

Результатом будет массив всех элементов book, соответствующих предикату фильтра.

NB: это метод ES5. На связанной странице MDN есть прокладка для браузеров, отличных от ES5.

person Alnitak    schedule 19.08.2012
comment
где конвертер json? - person Royi Namir; 20.08.2012
comment
@RoyiNamir, какой конвертер JSON? ОП, по-видимому, уже расшифровал JSON. - person Alnitak; 20.08.2012
comment
Я не понял, как будто он уже сделал это (и я все еще думаю, что он этого не сделал) - person Royi Namir; 20.08.2012
comment
Благодарить. Это сработало. Но мне удалось изменить свой код, чтобы просто получить значение индекса массива для каждого элемента вместо заголовка и использовать его. Это по-прежнему будет полезно в тех случаях, когда невозможно получить порядковый номер. - person 0pt1m1z3; 20.08.2012
comment
Чтобы получить другие значения console.log(matches[0].category); console.log(соответствует[0].автор); console.log (соответствует [0]. цена); - person Danish Adeel; 05.02.2017

person    schedule
comment
эй, я обновил ответ. Он вернет соответствующую книгу из магазина - person Ashirvad; 20.08.2012