如何检查深层对象是否有价值

时间:2015-05-23 13:27:05

标签: javascript recursion

我需要检查深层对象是否包含特定值并返回true / false。此对象不限于它可以具有的嵌套对象或数组的数量。

// sample object
{
  "id": 2,
  "name": "Mann Anderson",
  "documents": [
    {
      "score": 36,
      "documentTitle": "Document Title: 8397640",
      "source": "RAND Data"
    }
  ],
  "emailAddresses": [
    "mann.anderson@kidgrease.ca"
  ]
}

我正在使用这个递归函数迭代对象:

function deepQuery(value, q){
  if(_.isArray(value) || _.isPlainObject(value)) {
    _.each(value, function(v, k) {
      return deepQuery(v, q);
    });
  } else if(value.toString().toLowerCase().indexOf(q) !== -1) {
    console.log(true);
    return true;
  }
}

该功能似乎有效(预计会出现the console.log(true)),但由于该功能,我只获得undefined

起初我认为这是因为我没有将递归调用返回deepQuery(),但正如您所看到的,情况并非如此。

1 个答案:

答案 0 :(得分:2)

有:

_.each(value, function(v, k) {
  return deepQuery(v, q);
});

您只能从传递给_.each的回调中返回,而不是从该功能返回。当然,返回只返回第一个更深呼叫的值,而不是第一个肯定搜索。

将其更改为

var v = false;
_.each(value, function(v, k) {
   v |= deepQuery(v, q);
});
return v;

或更好:使用良好的旧for循环来完全避免问题(并避免在找到匹配时继续迭代):

function deepQuery(value, q){
   if (_.isArray(value)) {
    for (var i=0; i<value.length; i++) {
        if (deepQuery(value[i], q)) return true;
    }
   } else if(_.isPlainObject(value)) {
    for (var k in value) {
        if (deepQuery(value[k], q)) return true;
    }
  } else if(value.toString().toLowerCase().indexOf(q) !== -1) {
    return true;
  }
}