这是场景......
我有以下多维数组:
[
[1, 'red', 'x', true],
[1, 'red', 'y', true],
[1, 'red', 'z', false],
[2, 'red', 'x', true],
[2, 'red', 'y', false],
[2, 'red', 'z', false],
[1, 'blue', 'x', true],
[1, 'blue', 'y', true],
[1, 'blue', 'z', false],
[2, 'blue', 'x', true],
[2, 'blue', 'y', true],
[2, 'blue', 'z', false]
]
用户可以选择前三个属性中的任意两个,我需要为其余数组返回true或false列表。
例如,如果用户选择了'blue'和'x',我会返回:1:true,2:true。
可能并不总是有3个选项,可能会有更多或者只有一个。
有人有一个优雅的解决方案吗?
答案 0 :(得分:2)
filter非常优雅地做到这一点:
var data = […];
var selected = [ , 'blue', 'x', ]; // could be any two
// note the sparse array!
var result = data.filter(function(item) {
return selected.every(function(v, i) {
return item[i] == v;
});
}); // [[1,"blue","x",true],
// [2,"blue","x",true]]
如果您希望该列表作为对象,请使用
var key = [0, 1, 2].filter(function(k){ return ! (k in selected); })[0];
var obj = result.reduce(function(m, item) {
m[item[key]] = item[3];
return m;
}, {}); // {"1":true,"2":true}
答案 1 :(得分:0)
我做了一个函数,把结果放到一个数组中,这里是code pen
function getMatch(b,c){
var found = 0;
for(var i = 0; i<a.length;i++){
found = 0;
for(var j = 0; j<4; j++){
if(a[i][j] == b){
found += 1;
}
if(a[i][j] == c){
found += 1;
}
if(found == 2){
found = 0;
match.push(a[i]);
}
}
}
}
答案 2 :(得分:0)
我做了一个小功能,可以轻松搜索超级数据,您只需要为数据定义一个地图。
功能:(JSFiddle)
function findInData(data, map, query) {
var matches = [];
data.forEach(function (value) {
var match = true,
result = {};
for (var property in query) {
if (query.hasOwnProperty(property)) {
if (value[map[property]] !== query[property]) {
match = false;
}
}
}
if (match) {
result[value[0]] = value[map['result']];
matches.push(result);
}
});
return matches;
}
示例地图(适用于您的数据):
var map = {
color: 1,
XYZ: 2,
result: 3
}
color: 1
因为颜色的值位于数据数组的[1]
位置
使用示例:
var example = findInData(data, map, {color: 'blue', XYZ: 'x'})
返回
{"1":true}
{"2":true}