我有以下对象:
GLOBALS = [
[...],
[...],
[
[...],
["searchValue", [<interestingInfo>]]
]
]
我想找到一种基于searchValue获取数组的方法。
编辑:这是我的非工作尝试:GLOBALS.map(function(item){
if(item && item.constructor === Array)
return item.map(function(itemLvl2) {
if(itemLvl2 && itemLvl2.constructor === Array)
return itemLvl2.map(function(itemLvl3) {
return itemLvl3 && itemLvl3.constructor === Array && itemLvl3[0] == 'searchValue'
});
else
return false;
});
else
return false;
})
编辑:采样数据/使用案例
需要这个以便从gmail获取所有别名电子邮件地址。您可以在打开Gmail时将其输入并在控制台中输入以下内容:
GLOBALS[17][15][1].map(function(item) { return item[1]; })
现在我尝试以更通用的方式执行此操作(即不对数组索引进行硬编码)
搜索值为'cfs'
答案 0 :(得分:1)
根据建议,您可以使用递归来摆脱硬编码级别。
<强>的优化:强>
if (JSON.stringify(array).indexOf(search) < 0) return;
。这将确保当前对象树是否具有指定值。如果没有,将跳过整个树。Array.isArray(array)
将仅检查数组。array.indexOf(search) < 0
将检查搜索是否在此数组中。如果未找到,则某些子节点中存在值。这也将消除仅检查第一个值的依赖性。是的,这会增加性能,但即使订单发生变化也会有效。Array.some
因为它会在第一个正确的值上短路。function getSearchValue(array, search) {
if (JSON.stringify(array).indexOf(search) < 0) return;
if (Array.isArray(array)) {
if (array.indexOf(search) < 0) {
var r = null;
array.some(function(item) {
r = getSearchValue(item, search)
return !!r
})
return r;
} else {
return array;
}
}
}