Задать вопрос

Как оптимальнее реализовать поиск значений в json?

Есть json вида

[
    {
        "name": "Adhi Kot",
        "id": "379",
        "nametype": "Valid",
        "recclass": "EH4",
        "mass": "4239",
        "fall": "Fell",
        "year": "1919-01-01T00:00:00.000",
        "reclat": "32.100000",
        "reclong": "71.800000",
        "geolocation": {
            "type": "Point",
            "coordinates": [
                71.8,
                32.1
            ]
        }
    }
]


Как оптимальнее без перебора реализовать вывод значений (любых) по recclass ?
  • Вопрос задан
  • 288 просмотров
Подписаться 3 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
dollar
@dollar
Делай добро и бросай его в воду.
Через indexOf можно. Это самое оптимальное, что приходит в голову, т.е. самый прямой поиск "в лоб" без лишних вычислений. Оптимальнее только поиск без поиска, когда заранее известны индексы, откуда нужно брать значения.

var json_str = `,{"name":"Adhi Kot","id":"379","nametype":"Valid","recclass":"EH4","mass":"4239","fall":"Fell","year":"1919-01-01T00:00:00.000","reclat":"32.100000","reclong":"71.800000","geolocation":{"type":"Point","coordinates":[71.8,32.1]}},{"name":"Adzhi-Bogdo (stone)","id":"390","nametype":"Valid","recclass":"LL3-6","mass":"910","fall":"Fell","year":"1949-01-01T00:00:00.000","reclat":"44.833330","reclong":"95.166670","geolocation":{"type":"Point","coordinates":[95.16667,44.83333]}}`;
var i = 0;
while((i=json_str.indexOf('"recclass":"',i))!==-1) {
	i+=12;
	let j = json_str.indexOf('"',i);
	let val = json_str.substring(i,j);
	console.log(val); //выводим очередное значение
}
Ответ написан
hzzzzl
@hzzzzl
это же массив с объектами?

data = [
  {"name":"Adhi Kot","id":"379","nametype":"Valid","recclass":"EH4","mass":"4239","fall":"Fell","year":"1919-01-01T00:00:00.000","reclat":"32.100000","reclong":"71.800000","geolocation":{"type":"Point","coordinates":[71.8,32.1]}},
  {"name":"Adzhi-Bogdo (stone)","id":"390","nametype":"Valid","recclass":"LL3-6","mass":"910","fall":"Fell","year":"1949-01-01T00:00:00.000","reclat":"44.833330","reclong":"95.166670","geolocation":{"type":"Point","coordinates":[95.16667,44.83333]}}
]

const find = (rec, key) => (data.find(v => v.recclass === rec) || {})[key]

find('EH4', 'mass')
// 4239
Ответ написан
@Dmtm
Android
алгоритм Бойера-Мура, как раз для образца который не меняется
Ответ написан
Комментировать
@krka92
Если без десериализации, то можно парсить ключ и значение.
1. Когда встретим "recclass" - проверим значение на совпадение. Если совпало - нашли.
2. Можно завести массив, который будет содержать только значения "recclass" в соответствии с элементами в json.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы