Лучший / быстрый способ извлечь значение с соответствующим свойством на разной глубине вложенного объекта с условием - PullRequest
0 голосов
/ 25 марта 2019

У меня есть объект с непоследовательной структурой вложения, который я не могу контролировать.Мне нужно извлечь определенное значение, если оно удовлетворяет определенному условию.

в настоящее время делает это, рекурсивно перебирая свойства и сопоставляя свойства с условием и помещая сопоставленные значения в пустой массив, например так:

var obj = {"a":0,"b":{"x":1,"y":100},"c":[{"x":1,"y":120},{"x":2,"y":140}]};
var extracts = [];
extractProp(obj);

function extractProp(obj){
    for (var key in obj){
        if (key == "x" && obj[key]=="1"){
            extracts.push(obj["y"]);
        } else {
            extractProp(obj[key]);
        }
    }
}
console.log(extracts); //(2) [100, 120]

, что позволяет мне получить ожидаемый результат.В моем предыдущем вопросе кто-то указал лучший способ изменения частей json, передав параметр reviver в JSON.parse.Это заставило меня задуматься о том, что должен быть лучшим способом сделать это тоже.Есть ли встроенная / встроенная функция в javascript для этого?

1 Ответ

0 голосов
/ 25 марта 2019

Не намного лучше, но быстрее

Проверьте сравнение здесь http://jsben.ch/7OZfP

let obj = { "a": 0, "b": { "x": 1, "y": 100 }, "c": [{ "x": 1, "y": 120 }, { "x": 2, "y": 140 }] };

var extracts = [];
extractProp(obj);

function extractProp() {
	Object.entries(obj).forEach(([key, val]) => {
		if (typeof val === 'object') {
			if (Array.isArray(val)) {
				val.forEach(gety)
			} else {
				gety(val)
			}
		}
	});
}

function gety({ x, y }) {
	if (x == 1 && y)
		extracts.push(y);
}
console.log(extracts); //(2) [100, 120]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...