Javascript 按公共值合并数组

Javascript 按公共值合并数组,javascript,jquery,Javascript,Jquery,我真的搞不懂这个 我该如何扭转这种局面: varAllMix = [[1,2], [3,4], [1,4], [5,6], [7,2], [8,5], [9,10], [11,6]]; 为此: varComGroup = [[1,2,3,4,7],[5,6,8,11],[9,10]] 例如:[1,2,3,4,7]是通过公共值合并[1,2],[3,4],[1,4],[7,2]的结果: [1,2] + [1,4] -> [1, 2, 4] [1, 2, 4] + [3,4] -> [

我真的搞不懂这个

我该如何扭转这种局面:

varAllMix = [[1,2], [3,4], [1,4], [5,6], [7,2], [8,5], [9,10], [11,6]];
为此:

varComGroup = [[1,2,3,4,7],[5,6,8,11],[9,10]]
例如:
[1,2,3,4,7]
是通过公共值合并
[1,2],[3,4],[1,4],[7,2]
的结果:

[1,2] + [1,4] -> [1, 2, 4]
[1, 2, 4] + [3,4] -> [1, 2, 3, 4]
[1, 2, 3, 4] + [7, 2] -> [1, 2, 3, 4, 7]

这将非常有效地实现这一点(甚至每个
allMix
tuple支持两个以上的值):

var-AllMix=[[1,2]、[3,4]、[1,4]、[5,6]、[7,2]、[8,5]、[9,10]、[11,6];
var ComGroup=[],
查找={};//ComGroup per value中集合的查找表

对于(var i=0;i,您可以通过添加对以增量方式构建结果

m = {}; // map from an element to the connected component
result = [];

for (var i=0; i < lists.lenght; i++) {
    var a = lists[i][0], b = lists[i][1];
    var ca = m[a];
    var cb = m[b];
    if (ca && cb) {
        if (ca !== cb) {
            // two connected components got merged
            for (var bi=0; bi < cb.lenght; bi++) {
                ca.push(cb[bi]);
                m[cb[bi]] = ca;
            }
            cb.splice();
        }
    } else if (ca) {
        ca.push(b); // extending connected component of a
    } else if (cb) {
        cb.push(a); // extending connected component of b
    } else {
        // create a new connected component
        result.push(m[a] = m[b] = [a, b]);
    }
}

// remove leftovers from merge operations
result = result.filter(function(x){return x.length;});
m={};//从元素映射到连接的组件
结果=[];
对于(变量i=0;i
对元组进行分组的规则是什么?连接的整数,每个元组都是一条边?我不知道问题是什么…如果一个值存在于多个数组中,请将它们分组在一起,因此如果var1=[car,blue];var2=[ball,blue],那么varAll=[car,blue,ball,blue](删除重复项,我们有varAll=[car,blue,ball])对我来说,这看起来像是一个家庭作业问题。关于StackOverflow的问题,即使是智力上有挑战性的问题,也必须证明“对正在解决的问题的最低理解”这一个没有。请尝试自己解决它,当您有需要帮助的特定问题时,请回到这里。有关提出有效问题的进一步指导,请参阅这看起来很像我的解决方案,但不支持
allMix
tuple:-)顺便说一句,您忘记了
m[b]=ca
m[a]=cb
在扩展a-set部分。@Bergi:哎呀,你说得对。固定的。我没有先检查你的答案,但看起来确实是一样的想法。我没有考虑输入中的多个元素,因为如果它们不存在,那将是毫无意义的并发症(巧合的是它们都是对的)。我只是试图尽可能地避免代码重复(我需要一个小的挑战):-我希望它不会太复杂…太棒了!!!除IE8外,在FF中工作出色。。。。有什么问题吗?IE不支持-但您可以轻松地填充,或者使用普通循环从
ComGroup
中删除空集。
m = {}; // map from an element to the connected component
result = [];

for (var i=0; i < lists.lenght; i++) {
    var a = lists[i][0], b = lists[i][1];
    var ca = m[a];
    var cb = m[b];
    if (ca && cb) {
        if (ca !== cb) {
            // two connected components got merged
            for (var bi=0; bi < cb.lenght; bi++) {
                ca.push(cb[bi]);
                m[cb[bi]] = ca;
            }
            cb.splice();
        }
    } else if (ca) {
        ca.push(b); // extending connected component of a
    } else if (cb) {
        cb.push(a); // extending connected component of b
    } else {
        // create a new connected component
        result.push(m[a] = m[b] = [a, b]);
    }
}

// remove leftovers from merge operations
result = result.filter(function(x){return x.length;});