笛卡尔积的反转
Reverse of a cartesian product
给定以下代码:
function cartesianProductOf() {
return _.reduce(arguments, function(a, b) {
return _.flatten(_.map(a, function(x) {
return _.map(b, function(y) {
return x.concat([y]);
});
}), true);
}, [ [] ]);
};
var cp = cartesianProductOf([1, 2], [3, 4], ['a', 'b']); // [[1,3,"a"],[1,3,"b"],[1,4,"a"],[1,4,"b"],[2,3,"a"],[2,3,"b"],[2,4,"a"],[2,4,"b"]]
我正在寻找一种方法来逆转这个过程,这样
reverseCartesian(cp,[3,4]); // [[1,'a'],[1,'b'],[2,'a'],[2,'b']]
我不认为这对真实数据执行得更快,但你可以这样做
function reverseCartesian(cp, arr) {
return _.chain(cp)
.map(_.partial(_.difference, _, arr))
.uniq(function(currentItem) {
return currentItem.join("|");
})
.value();
}
console.log(reverseCartesian(cp, [3, 4]));
// [ [ 1, 'a' ], [ 1, 'b' ], [ 2, 'a' ], [ 2, 'b' ] ]
注意: 如果数组中包含带有 |
的元素,这将无法正常工作。仔细选择此字符(或字符集),使其不会出现在数组中。
给定以下代码:
function cartesianProductOf() {
return _.reduce(arguments, function(a, b) {
return _.flatten(_.map(a, function(x) {
return _.map(b, function(y) {
return x.concat([y]);
});
}), true);
}, [ [] ]);
};
var cp = cartesianProductOf([1, 2], [3, 4], ['a', 'b']); // [[1,3,"a"],[1,3,"b"],[1,4,"a"],[1,4,"b"],[2,3,"a"],[2,3,"b"],[2,4,"a"],[2,4,"b"]]
我正在寻找一种方法来逆转这个过程,这样
reverseCartesian(cp,[3,4]); // [[1,'a'],[1,'b'],[2,'a'],[2,'b']]
我不认为这对真实数据执行得更快,但你可以这样做
function reverseCartesian(cp, arr) {
return _.chain(cp)
.map(_.partial(_.difference, _, arr))
.uniq(function(currentItem) {
return currentItem.join("|");
})
.value();
}
console.log(reverseCartesian(cp, [3, 4]));
// [ [ 1, 'a' ], [ 1, 'b' ], [ 2, 'a' ], [ 2, 'b' ] ]
注意: 如果数组中包含带有 |
的元素,这将无法正常工作。仔细选择此字符(或字符集),使其不会出现在数组中。