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

时间:2014-03-06 09:01:34

标签: javascript json

我有一个Javascript对象,代表一个嵌套的JSON字符串,如下所示:

http://pastebin.com/vwZb1XrA

有许多级别包含“name”元素。例如“SVI”或“人口”或“人类发展指数”。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以使用递归函数,因此如果您只想更新具有特定名称的第一个对象,请执行以下操作:

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]);
        }
    }
}

这会更新而不返回任何内容。如果删除return语句,它应该使用您指定的名称更新所有对象。

答案 2 :(得分:0)

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

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似乎无效,因此我在此Fiddle

中包含了测试1