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

Check if item in array exists inside object

本文关键字:对象 内部 于对象 存在 数组 是否 检查      更新时间:2023-09-26

所以我有一个对象数组,我需要对照发送的几个变量进行检查。我使用下划线(不过纯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"]
      }]
  }]

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

  test  = function (module, state, option){
  }

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

  test(mod1,name1, option2);

我想检查是否有一个键为"mod1"的模块,然后在该对象内部,自定义url内部有一个状态为"name1"的对象,以及该对象选项数组内部是否有值"options2"。这是一些更严重的遍历,我可以使用一些帮助。感谢阅读!

使用Undercore.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

下面是一个如何使用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/

很明显,您可以用vanillaJS实现同样的东西。

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

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可以避免第三个循环。