【问题标题】:Better / Faster way to extract value with a matched property on different depth on a nested object with condition更好/更快的方法来提取具有条件的嵌套对象上不同深度的匹配属性的值
【发布时间】:2019-08-15 08:17:27
【问题描述】:

我有一个我无法控制的嵌套结构不一致的对象。如果满足某个条件,我需要提取某个值。

目前通过递归迭代属性并将属性与条件匹配并将匹配的值推送到一个空数组来实现,如下所示:

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]

这让我得到了预期的结果。在我之前的question 中,有人指出了通过在 JSON.parse 上传递 reviver 参数来修改部分 json 的更好方法。这让我想到必须也有更好的方法来做到这一点。 javascript中是否有任何本机/内置函数?

【问题讨论】:

  • IMO 您当前的方法很好,代码的意图很清楚,实际上没有什么可以减少的。我更喜欢Object 方法而不是for..in,但for..in 在这里仍然可以正常工作
  • 快速思考,我认为 reviver 函数不允许反向引用,所以如果你想要逆向(x 基于y 的值)那么你会被搞砸的。你的方法从这里看起来并没有那么糟糕,除了我会添加一些 if(hasOwnProperty) 和 if(obj && typeof obj === "object")

标签: javascript arrays object reviver-function


【解决方案1】:

不是更好,但更快

在这里查看比较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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2019-09-06
    • 2018-06-04
    相关资源
    最近更新 更多