javascript - 笛卡尔积的反转

标签 javascript math underscore.js set-theory

给定以下代码:

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' ] ]

注意:如果数组中包含带有 | 的元素,这将无法正常工作。仔细选择此字符(或字符集),使其不会出现在数组中。

关于javascript - 笛卡尔积的反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27996620/

相关文章:

math - 如何在法线周围逆时针排列3个点

backbone.js - Underscore的bindAll : Cannot read property 'bind' of undefined

javascript - 渲染模板时的 Backbone JS 触发事件

javascript - 禁用 Youtube 相关视频 rel=0

algorithm - 求两个值为 2 的整数之间的 Xor 值

javascript - extjs 网格适用于 Firefox,不适用于 IE

algorithm - 循环的时间复杂度按 log 增加?

backbone.js - 如何使用 RequireJS 加载 Backbone 深度模型?

javascript - 尝试使用特定 URL 预填充表单字段

javascript - 基于查找值求和二维数组中的值 - Javascript