javascript中具有嵌套数组和非数值的笛卡尔积
我有以下代码:javascript中具有嵌套数组和非数值的笛卡尔积,javascript,underscore.js,cartesian-product,Javascript,Underscore.js,Cartesian Product,我有以下代码: filters = [ { "see":false, "make":true, "means":true, }, { "less":false, "up3":false, "up6":false, "all":true,
filters = [
{
"see":false,
"make":true,
"means":true,
},
{
"less":false,
"up3":false,
"up6":false,
"all":true,
"more":false,
"var":false
},
{
"one":false,
"small":true,
"medium":false,
"large":false
}
];
function cartesianProductOf() {
return _.reduce(arguments, function(a, b) {
return _.flatten(_.map(a, function(x) {
return _.map(b, function(y) {
return x.concat([y]);
});
}), true);
}, [ [] ]);
}
function cleaning(collection){
var r = [];
_.each(collection,function(element,index){
r[index] = [];
if(_.isObject(element)){
r[index] = _.map(element,function(val,key){
if(val) return key;
});
}
r[index] = _.compact(r[index]);
});
return r;
}
// cleaning is producing following array
// [["make","means"],["all"],["small"]]
clean = cleaning(filters);
prod = cartesianProductOf(clean);
$('#result').append(JSON.stringify( prod ));
我期待的结果大致如下:[[make,all,small],[means,all,small]]
但我得到的是[[make,means]]、[[all]]、[[small]]]
笛卡尔积算法如下所示:
这是我的小提琴:
任何想法都将不胜感激。简言之:
换成
prod = cartesianProductOf.apply(null, clean);
错误在哪里:
答案很简单,您遇到了典型的类型动态语言问题,cartesianProductOf在参数中等待数组,这意味着所有数组都应该在逗号分隔的括号中传递:
cartesianProductOf(["make","means"],["all"],["small"])
但您只传递一个参数,即列表列表
cartesianProductOf([["make","means"],["all"],["small"]])
函数确实应该返回初始数组,因为一个数组的笛卡尔积就是该数组谢谢!这是多么明显的错误啊。