检查数组中的项目是否存在于对象内部

Check if item in array exists inside object

所以我有一个对象数组,我需要根据发送的几个变量来检查它。我正在使用下划线(虽然普通 javascript 也很好)我的对象数组看起来像这样 -

  var o = [{
      module: "mod1",
      customUrl: [{
          "state": "name1",
          "options": ["option1", "option2", "option3"]
      }, {
          "state": "name2",
          "options": ["option1", "option2", "option3"]
      }]
  }, {
      module: "mod2",
      customUrl: [{
          "state": "name1",
          "options": ["option1", "option2", "option3"]
      }, {
          "state": "name2",
          "options": ["option1", "option2", "option3"]
      }]
  }]

我有一个函数,我正在传递三个变量我想检查最后一个是否存在于第一个 2 中。让我告诉你我的意思

  test  = function (module, state, option){

  }

所以我想做的是,例如,如果我通过了

  test(mod1,name1, option2);

我想检查是否有一个模块的键为 "mod1",然后在该对象内部有一个状态为 [=22] 的自定义 url 对象=],并且如果该对象选项数组在其中具有值 "options2"。这是一些更严重的遍历,我需要一些帮助。感谢阅读!

您可以使用两个循环遍历数据结构:

o.forEach(function(m) {
    if (m.module === mod1) {
        m.customUrl.forEach(function(s) {
            if (f.state === name1 &&
                f.options.indeOf(option2) >= 0) {
                // We found it (one of them)
            }
        });
    }
});

在数组上使用 indexOf 可以避免第三个循环。

这是一个如何使用 lodash 执行此操作的示例。 (请注意,我将您的 o 数组命名为 objects,因为 o 在示例中似乎令人困惑。):

function test(moduleName, stateName, optionName) {
  var object = _.find(objects, function(object) { return object.module == moduleName; });
  if (object) {
    var customUrl = _.find(object.customUrl, function(customUrl) { return customUrl.state == stateName; });
    if (customUrl) {
      var option = _.find(customUrl.options, function(option) { return option == optionName; });
    }
  }

  return !!option;
}

http://jsfiddle.net/bvaughn/53h6zoeq/

你显然可以用 vanilla JS 实现同样的事情。

有了Underscore.js就和

一样简单
function testContains(o, module, state, option) {
    return _.chain(o)
        .findWhere({module: module})
        .result('customUrl')
        .findWhere({state: state})
        .result('options')
        .contains(option)
        .value();
}

演示:http://jsfiddle.net/3f1n32tj/

普通JavaScript版本:

function test(o, module, state, option) {
  return o.some(function(o) {
    return o.module == module && o.customUrl.some(function(o) {
      return o.state == state && o.options.indexOf(option) != -1;
    })
  });
}

http://jsfiddle.net/5335bp4j