我有一本字典:
a = {"staticData":['----','Blue','Green'], "inData":['Indatahere','----','----']}
如果字典中包含“----”,如何在任何键的值中找到
任何Javascript函数?
编辑:
如果案件是这样的怎么办?
a = {"staticData":[], "inData":['Indatahere','----','----']}
它给出了这个错误:
TypeError: a[elem].indexOf is not a function
答案 0 :(得分: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
。
答案 1 :(得分:1)
使用indexOf
搜索对象中的每个数组:
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&lt; 9,请参阅this post以有条件地将indexOf定义添加到Array对象。该帖还提到了一个Jquery替代品。
上面提到的SO帖子列出了indexOf
函数的Mozilla版本。
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;
};
}
答案 2 :(得分: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
等框架答案 3 :(得分: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 ----")
};
}
}