1

構造が同じではないオブジェクトがたくさんあります。しかし、私はそれらすべてがプロパティ名'siteName'を持っていることを知っています。私の質問は、このプロパティからどのように値を取得できるかです。いくつかのオブジェクトの説明:

feature1 = {
    display: "name",
    feature: {
        attributes: {
            when: '111',
            what: '222'
        },
        geometry: null
        infoTemplate: undefined
    },
    symbol: null
    siteName: 'aa'
}

feature2 = {
    feature: {
        attributes: {
            when: '111',
            what: '222'
        },
        geometry: null
        infoTemplate: undefined
    },
    static: {
        format: {
            weight: 12,
            siteName: 'cccc'
        },
    }
}
4

3 に答える 3

3

これがあなたのために働くはずの再帰関数です。

名前で最初に見つかったプロパティの値を返します。それ以外の場合は。を返しますundefined

function findByName(obj, prop) {
    for (var p in obj) {
        if (p === prop) {
            return obj[p];
        } else if (obj[p] && typeof obj[p] === "object") {
            var result = findByName(obj[p], prop);
            if (result !== undefined)
                return result;
        }
    }
}

var result = findByName(myObject, "siteName");

または、継承されたプロパティを回避する別のバリ​​エーションがあります。

function findByName(obj, prop) {
    if (obj.hasOwnProperty(prop))
        return obj[prop];

    for (var p in obj) {
        if (obj[p] && typeof obj[p] === "object") {
            var result = findByName(obj[p], prop);
            if (result !== undefined)
                return result;
        }
    }
}
于 2012-12-03T14:08:30.073 に答える
1

オブジェクトを再帰的にループします。

function find(obj, name) {
    for (var k in obj) { // Loop through all properties of the object.
        if(k == name){ // If the property is the one you're looking for.
            return obj[k]; // Return it.
        }else if (typeof obj[k] == "object"){ // Else, if the object at [key] is a object,
            var t = find(obj[k], name); // Loop through it.
            if(t){ // If the recursive function did return something.
                return t; // Return it to the higher recursion iteration, or to the first function call.
            }
        }               
    }
}

使用法:

find(feature1, "siteName"); //Returns "aa"
于 2012-12-03T14:08:22.320 に答える
0

次の関数は、ニーズに合うはずです。

function getFirstFoundPropertyValue(searchedKey, object) {
    if(typeof object === "object") {
        for (var key in object) {
            var currentValue = object[key];
            if(key === searchedKey) {
                return currentValue;
            }
            var nested = getFirstFoundPropertyValue(searchedKey, currentValue);
            if(typeof nested !== "undefined") {
                return nested;
            }
        }
    }
}

キーが見つかった場合はキーの値を返し、undefinedそれ以外の場合はキーの値を返します。キーが複数回表示される場合は、最初に見つかったキーが返されます。

于 2012-12-03T14:15:43.670 に答える