如何搜索所有级别嵌套的JavaScript对象



我有一个javaScript对象,代表这样的嵌套json字符串:

http://pastebin.com/vwzb1xra

有许多级别包含一个"名称"元素。例如" SVI"或"人口"或"人类发展指数"。

我试图找到一种迭代对象的各个级别的方法,以找到" SVI"或"人口"或"人类发展指数"的名称。进行匹配时,我想用这样的东西替换重量值:

if (data[key].name == name) {
    data[key].weight = 55;
}

您可以递归检查每个对象,例如此对象

function rec(currentObject, values, replacement) {
    if (values.some(function(currentValue) {
        return currentObject.name === currentValue;
    })) {
        currentObject.weight = replacement;
    }
    (currentObject.children || []).forEach(function(currentItem) {
        rec(currentItem, values, replacement);
    });
}
rec(data, ["SVI", "Population", "Human Development Index"], 55);
console.log(data);

Working demo

您可以使用递归函数,因此,如果您只想更新一个具有某个名称的对象,则类似的内容:

function search(name, value, object) {
    if (object.name == name) { 
        object.weight = value; 
        return; 
    }
    if(object.children) {
        var i = object.children.length;
        while(i--) {
            search(name, value, object.children[i]);
        }
    }
}

这将在不返回任何内容的情况下进行更新。如果您删除返回语句,则应更新所有对象,并使用您指定的名称。

您需要一个递归功能,这将遍历每个元素并处理其子女。这样的事情可能有效:

function ChangeWeightsOfName(arr, nameVal) {
    for (var i = 0; i < arr.length; i++) {
        var item = arr[i];
        if (item.name === nameVal) {
            item.weight = 42;
        }
        if (item.children && Array.isArray(item.children)) {
            ChangeWeightsOfName(item.children, nameVal);
        }
    }
}

您的粘贴JSON似乎没有有效,因此我在此小提琴中包括了一个测试

最新更新