5

次のような辞書があります。

a = {"staticData":['----','Blue','Green'], "inData":['Indatahere','----','----']}

辞書のキーの値のいずれかに「----」が含まれているかどうかを確認するにはどうすればよいですか。
JavaScript関数はありますか?
編集:ケースがこのような場合はどうなりますか?

a = {"staticData":[], "inData":['Indatahere','----','----']}

このエラーが発生しています:

TypeError: a[elem].indexOf is not a function
4

4 に答える 4

2

indexOfオブジェクト内の各配列を検索するために使用します。

for (elem in a)
{
    if (a[elem].indexOf("----") != -1)
       alert('---- found at ' + a[elem]);
}

EDIT このエラーTypeError: a[elem].indexOf is not a functionの場合: ブラウザーは空の要素を非文字列型と見なす可能性があります。非文字列型には indexOf メソッドがありません。

このコードは、配列要素の長さをチェックします (indexOf関数を解釈する前に要素が空の場合)。

for (elem in a)
{
    if (a[elem].length > 0 && a[elem].indexOf("----") != -1)
       alert('---- found at ' + a[elem]);
}

IE < 9 をサポートする場合は、この投稿を参照して、条件付きで indexOf 定義を Array オブジェクトに追加してください。この投稿では、Jquery の代替についても言及しています。

上記の SO 投稿には、この Mozilla バージョンのindexOf機能がリストされています。

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
于 2013-07-10T10:17:53.223 に答える
1

値のネストレベルが正確にわかっている場合は、(他の回答で提案されているように)簡単な解決策が可能です。

ただし、深いトラバーサル検索が必要な場合は、次のようなソリューションの再帰バージョンが必要になります。

function FindTraverse(data, match)
{
    for (var prop in data)
    {
         if (!data.hasOwnProperty(prop)) continue;
         if (data[prop] == match) return true;
         if (typeof data[prop] == 'object' && FindTraverse(data[prop], match)) return true;
    }

    return false;
}

例:

FindTraverse({a:'Foo',b:'Bar'}, 'Bar') // true
FindTraverse(['Foo','Bar'], 'Bar') // true
FindTraverse([{name:'Foo'},{name:'Bar'}], 'Bar') // true
FindTraverse({a:{name:'FooBar'},b:'Bar'}, 'FooBar') // true

ただし、より完全なソリューションを探している場合は、jsTraverseなどのフレームワークを使用してください。

于 2013-07-10T10:38:44.237 に答える
0

Object.getOwnPropertyNames()を使用します。

2 つのネストされたループを記述する必要があります。Object.getOwnPropertyNames を使用すると、オブジェクトのプロパティ名で構成される配列にアクセスしています。次に、これらのプロパティの値をループして、この 2 番目の配列内の正しい要素を識別する必要があります。

a = {"staticData":['----','Blue','Green'], "inData":['Indatahere','----','----']}

props = Object.getOwnPropertyNames(a);

for (i=0;i < props.length;i ++) {
    for (z = 0; z < a[props[i]].length; z ++) {
        //console.log(a[props[i]][z])
        if ( (a[props[i]][z]) == '----') {
            console.log("I have found an item with ----")
        };
    }
}
于 2013-07-10T11:05:05.743 に答える