js从项目[0] = somevalue的嵌套数组中获取item [1]

时间:2017-06-08 08:34:09

标签: javascript

我有以下对象:

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'

1 个答案:

答案 0 :(得分:1)

根据建议,您可以使用递归来摆脱硬编码级别。

<强>的优化:

  1. if (JSON.stringify(array).indexOf(search) < 0) return;。这将确保当前对象树是否具有指定值。如果没有,将跳过整个树。
  2. Array.isArray(array)将仅检查数组。
  3. array.indexOf(search) < 0将检查搜索是否在此数组中。如果未找到,则某些子节点中存在值。这也将消除仅检查第一个值的依赖性。是的,这会增加性能,但即使订单发生变化也会有效。
  4. Array.some因为它会在第一个正确的值上短路。
  5. 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;
        }
      }
    }