5

我有一本像这样的字典:

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

如果字典在任何键的值中包含“----”,我如何才能找到它。
任何Javascript函数?
编辑:如果情况是这样的怎么办?

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

它给出了这个错误:

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

4 回答 4

2

这是代码:

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

for(var key in a){
    var value = a[key];
    for(var i=0; i<value.length; i++){
        if(value[i] == '----') alert("Found '----' in '" + key + "' at index " + i);
    };
}

编辑:将数组的迭代更改为normal评论后的方式。

于 2013-07-10T10:16:15.547 回答
2

用于indexOf搜索 a 对象中的每个数组:

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

编辑 对于这个错误: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()

您必须编写两个嵌套循环。使用 Object.getOwnPropertyNames 您正在访问一个由对象的属性名称组成的数组。然后,您将需要遍历这些属性的值并在第二个数组中识别正确的元素。

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 回答