检查数组中的项目是否存在于对象内部
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();
}
普通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;
})
});
}
所以我有一个对象数组,我需要根据发送的几个变量来检查它。我正在使用下划线(虽然普通 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();
}
普通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;
})
});
}