Пересечение списка JS для моего варианта использования - PullRequest
0 голосов
/ 28 августа 2011

Я новичок в JavaScript, так что терпите меня. У меня есть списки как так:

var list1 = ['a','b','c'];
var list2 = ['c','d','e'];
var list3 = ['f','g'];

Как вы видите, list1 и list2 пересекаются в 'c', а list3 не пересекается ни с list1, ни с list2.
Результат должен быть

['a','b','c','d','e'],['f','g'] // Two arrays

Мы объединили list1 и list2, поскольку они пересекаются, оставляя list3 как есть. Другой пример:

var list1 = ['a','b','c'];
var list2 = ['d','e','f'];
var list3 = ['f','g','a'];

Здесь мы видим, что list1 и list2 не пересекаются, list1 пересекается со list3 в «a», а list2 пересекает list3 в «f». Таким образом, поскольку все 3 пересекаются, возвращаемый результат будет:

['a','b','c','d','e','f','g'] // One array

Любая помощь приветствуется
KA

PS: я выполнил поиск по сайту схожей проблемы и наткнулся на одно пересечение n списков через JS Это похоже, но не подходит для моего варианта использования.

Ответы [ 2 ]

1 голос
/ 28 августа 2011

Если у вас есть функции пересечения и объединения двух списков, вы можете получить желаемое с помощью этой логики:

var lists; // initialized with the lists you want to process
var merged = [];
for each list a in lists {
    for each list b in merged {
        if intersect(a,b) != empty {
            remove b from merged;
            a = union(a,b);
        }
    }
    add a to merged;
}

Вы просто должны быть немного осторожны с удалением b из объединенного, пока вы просматриваете все элементы объединенного. Может быть проще перебрать объединенный от последнего до первого элемента. Библиотека подчеркивания - хорошее место для поиска функций для пересечения и объединения.

0 голосов
/ 28 августа 2011

1001 * попробовать *

<script>
    Array.prototype.unique = function() {  
        var temp = {}, len = this.length;
        for(var i=0; i < len; i++)  {  
            if(typeof temp[this[i]] == "undefined") {
                temp[this[i]] = 1;
            }  
        }  
        this.length = 0;
        len = 0;
        for(var i in temp) {  
            this[len++] = i;
        }  
        return this;  
    }  

    var list1 = ['a','b','c'];
    var list2 = ['c','d','e'];
    var list3 = ['f','g'];


    start = new Date().getTime(); 
    var list = list1.concat(list2).concat(list3).unique(); 
</script>
...