0

Javascript でネストされた配列を使用するアプリケーションに取り組んでいます。私はこのような配列を持っています:

var a = ["Once upon a time there was a man."];

    a[1] = ["He was tall."];
           a[1][1] = ["He often bumped his head."];

    a[2] = ["He was short."];
           a[2][1] = ["He couldn't reach high shelves."]

値が配列のどのレベルにあるかを把握する簡単な方法はありますか? 「彼はよく頭をぶつけた」と入力して「a[1][1]」を返すようにしたい(または「彼は背が低かった」と入力すると「a[2]」が返される) )。配列は不確定で変動するサイズになります。

これについてご協力いただきありがとうございます。私はjavascriptとjqueryを初めて使用するので、ソリューションの説明をいただければ幸いです。再度、感謝します。

4

3 に答える 3

0

これははるかに簡単な答えです。;)

function array_search(ob,str)
{
    for(var i=0;i<ob.length;++i)
    {
        if(typeof(ob[i])=='object'&&(ob[i] instanceof Array))
        {
            var foo=array_search(ob[i],str);
            if(foo!=null)
                return i+'->'+foo;
        }else
        if(typeof(ob[i])=='string'&&ob[i]==str)
        {
            return i;
        }
    }
    return null;
}

var a = ["Once upon a time there was a man."];
a[1] = ["He was tall."];
a[1][1] = ["He often bumped his head."];
a[2] = ["He was short."];
a[2][1] = ["He couldn't reach high shelves."]

alert(array_search(a,'He was short.'));
于 2012-04-08T01:13:10.037 に答える
0

いくつかの再帰はトリックを行う必要があります:

Array.prototype.recursiveIndexOf = function(item, start) {
    var i = this.indexOf(item);
    var r, c;

    start = start || [];

    if(i > -1) {
        return start.concat([i]);
    }

    for(i = 0; i < this.length; i++) {
        c = this[i];

        if(Object.prototype.toString.call(c) === '[object Array]') {
            r = c.recursiveIndexOf(item, start.concat(i));

            if(r !== null) {
                return r;
            }
        }
    }

    return null;
};

これがデモです。

于 2012-04-08T00:56:19.297 に答える
0

2 レベルの配列の場合、次のようにすることができます。

function findMultiArray(array, str) {
    var innerArray;
    for (var i = 0; i < array.length; i++) {
        innerArray = array[i];
        for (var j = 0; j < innerArray.length; j++) {
            if (innerArray[j] == str) {
                return([i, j]);
            }
        }
    } 
    return null;
}

データ形式のデータが必要な場合に使用するのが少し簡単なので、2 つのインデックスを含む実際の配列を返すだけにしたことに注意してください。

あなたのリクエストとは異なり、それは文字列ではなく配列であるa[1]ため、と同等のものを返すことは決してないので、一致は withではなく withです。その場合、それは を返します。a[1]a[1][0]a[1][1,0]

戻り値を別の形式で取得したい場合は、1 行のコードで一致が確認され、i と j が一致したインデックスになります。

配列のレベルがさまざまな場所でさまざまな深さで任意に深くなる可能性がある場合、それはもう少し複雑になり、アイテムのタイプを調べて、ネストされた配列または文字列のみが含まれているかどうかを確認する必要があり、何らかのスタックが必要になります。現在の位置を維持します。再帰で行うのが最も簡単でしょう。

于 2012-04-08T01:02:43.667 に答える