2015-06-18 14 views

Odpowiedz

2

Do wykonania tego celu można użyć podkreślnika flatten i unique. Jednak, gdy używasz wielu operacji podkreślenia, że ​​jest to dobry czas, aby rozważyć użycie underscore chainging z chain i value:

var data = [ 
    [{ id: 1 }, { id: 2 }], 
    [{ id: 3 }], 
    [{ id: 3 }, { id: 4 }] 
]; 

var result = _.chain(data) 
        .flatten() 
        .uniq(function(o) { 
         return o.id; 
        }) 
        .value(); 

console.log('result', result); 

JSFiddle: http://jsfiddle.net/0udLde0s/3/

Nawet krótszy z aktualnym underscore.js

Jeśli używasz najnowszej wersji Underscore.js (próbowałem prądu, który jest teraz 1.8.3 teraz), możesz użyć .uniq('id'), dzięki czemu jest jeszcze krótszy:

var result = _.chain(data) 
        .flatten() 
        .uniq('id') 
        .value(); 
+0

Możesz zamienić funkcję w wywołaniu na uniq na ciąg "id", np. '.uniq ('id')' –

+0

@GruffBunny Ach, masz rację, w obecnej wersji programu underscorejs, '.uniq ('id')' działa, ale nie w starszej wersji (1.5) Zdarzyło mi się używać na JSFiddle. – Cymen

+0

@GruffBunny Dzięki za wskazanie tego - zaktualizowałem. – Cymen

2

Można użyć _.flatten i _.uniq, tak jak

var data = [ 
 
    [{ id: 1 }, { id: 2 }], 
 
    [{ id: 3 }], 
 
    [{ id: 3 }, { id: 4 }] 
 
]; 
 

 
var result = _.uniq(_.flatten(data), function (el) { 
 
    return el.id; 
 
}); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

3
var a = [ 
    [{ id: 1 }, { id: 2 }], 
    [{ id: 3 }], 
    [{ id: 3 }, { id: 4 }] 
]; 

var flattened = _(a).flatten().uniq('id').value(); 

Oczywiście trzeba includ e lodash do swojej strony internetowej.

+0

To jest miłe, że lodash ma skrót do uzyskania własności w 'uniq'! – Cymen

+0

Podkreślenie robi to również –

0

Nie trzeba żadnej biblioteki na to, że to całkiem proste:

function flatten(arr) 
 
{ 
 
    var map = {}; 
 
    var flatArray = []; 
 
    function pushToMap(o) { 
 
    if(map[o.id]) 
 
     return; 
 
    
 
    map[o.id] = true; 
 
    flatArray.push(o); 
 
    } 
 
    function arrRecurse(a) { 
 
    if(a.length === undefined) 
 
     pushToMap(a); 
 
    else { 
 
     a.forEach(function(i) { 
 
     arrRecurse(i); 
 
     }); 
 
    } 
 
    } 
 

 
    arrRecurse(arr); 
 
    return flatArray; 
 
} 
 

 
var _3dArray = [ 
 
    [{ id: 1 }, { id: 2 }], 
 
    [{ id: 3 }], 
 
    [{ id: 3 }, { id: 4 }] 
 
]; 
 

 
alert(JSON.stringify(flatten(_3dArray)));

+0

Przyjemne rozwiązanie niebiblioteczne, ale czasami lepiej jest z niego korzystać, zwłaszcza gdy sprawia, że ​​kod jest czystszy i łatwiejszy w czytaniu lub utrzymaniu. Nie zawsze możemy uniknąć korzystania z rozwiązań innych firm, dlatego prawie każda strona zawiera przynajmniej jQuery. – itachi

+0

I jeszcze jedno, sprawdzając "niezdefiniowane", wykonaj to w ten sposób: 'if (typeof a === 'undefined') {...}'. 'if (a === undefined)' rzuci wyjątek. – itachi

+0

@itachi - Twoje prawo, ale nikt nie powiedział nic o stronie internetowej. Dzisiaj węzeł jest wiodącą platformą.Nawet przy rozważaniu stron WWW po stronie klienta, ładowanie dowolnej biblioteki ma swoje koszty (żądanie asynchroniczne, ładowanie, parsowanie ...) zależy od złożoności. – Amit

0

Nie biblioteka, tylko rodzime JS:

var ar = [ 
 
    [{ id: 1 }, { id: 2 }], 
 
    [{ id: 3 }], 
 
    [{ id: 3 }, { id: 4 }] 
 
]; 
 

 
//start 
 
var output = []; 
 
for (var x = 0, al = {}; x < ar.length; x++) 
 
    for (var y = 0, t = ar[x][y]; y < ar[x].length; y++, t = ar[x][y]) 
 
     al[t.id] = (!al[t.id]) ? output.push(t) : 1; 
 
//end 
 

 
document.body.innerHTML += JSON.stringify(output);