1

私は JavaScript リテラルを持っています:

var members = {
    "mother": {
        "name" : "Mary",
        "age" : "48",
        "connection": {
            "brother" : "sun"
        }
    },
    "father": {
        "name" : "Bill",
        "age" : "50"
    },
    "brother": {
        "name" : "Alex",
        "age" : "28"
    }
}

上記のリテラルから接続を読み取る関数があります。次のようになります。

 function findRelations(members){
    var wires = new Array();
    var count = 0;
    for (n = 0; n < members.length; n++){
         alert(members.length); // this alert is undefined
        if (members[n].connection){
            for (i = 0; i < members[n].connection[0].length; i++){
                var mw = new Array();
                var destination = 0;
                for (m = 0; m < members.length; m ++){
                    if (members[m] == members[n].connection[0]){
                        destination = m;
                        mw = [n, destination];
                        wires [count] = mw;
                        count++;
                    }
                }
            }
        }
    }
    return wires;
 }

ただし、この関数を実行しても何も得られません。そして、関数内に配置された最初のアラートは、「未定義」をまったく示しています。

findRelations(members);
alert("Found " + wires.length + " connections");

それはJavaScriptリテラルのせいだと思います。関数を変更する方法、またはリテラルを JSON 配列に変更して機能させる方法を提案できますか?! 最後に、「m」と「n」の値を数値として取得します。

4

2 に答える 2

1

「リテラル」とは何ですか?「リテラル表記を使用して作成されたオブジェクト」を意味していると思います。

配列 (および文字列) のみが長さプロパティを持ち、必要なのはプロパティをループすることです

for (var prop in members) {
    if (members.hasOwnProperty(prop)) {
          alert("members has property " + prop);
    }
}

残りのロジックに従うのは簡単ではないので、これは正しい道を歩むはずです

于 2010-04-23T16:39:02.707 に答える
0

「メンバー」変数がオブジェクトであるのに対し、関数は配列を期待しているように見えるため、アラートは「未定義」を返します。

「長さ」プロパティはオブジェクトで定義されていません。そう、

var a = {
    name:'test',
    age:56
};
console.log(a.length);  //undefined

返事がないのも同じ理由です。

于 2010-04-23T16:39:26.317 に答える