5

Io non riesco a capire come trovare l'intersezione di questo set di pannelli:Come trovo l'intersezione di una matrice di matrici che contengono oggetti usando Javascript/underscorejs?

[ 
[ 
    {"name":"product1","light":"1"}, 
    {"name":"product2","light":"2"}, 
    {"name":"product5","light":"5"}, 
    {"name":"product4","light":"4"} 
], 
[ 
    {"name":"product2","light":"2"}, 
    {"name":"product3","light":"3"}, 
    {"name":"product4","light":"4"} 
],[...more arrays with objects] 
] 

questo è solo dati di esempio, il vero set ho cambia molto, ma con quella struttura. Voglio che l'incrocio tornato a guardare come questo (un singolo array degli oggetti intersecate):

[ 
{"name":"product2","light":"2"}, 
{"name":"product4","light":"4"}, 
] 

ho provato questo con LoDashjs e Underscorejs:

_.intersectionObjects = _.intersect = function(array) { 
var slice = Array.prototype.slice; // added this line as a utility 
var rest = slice.call(arguments, 1); 
return _.filter(_.uniq(array), function(item) { 
    return _.every(rest, function(other) { 
    //return _.indexOf(other, item) >= 0; 
    return _.any(other, function(element) { return _.isEqual(element, item); }); 
    }); 
}); 
}; 

Ho bisogno di questo perché sto cercando di crea un sistema di tag usando knockoutjs. Ho un layout di pulsanti di tag categorizzati che scrivono su un array "osservabile" del filtro su clic, l'unica cosa rimasta è trovare l'intersezione dei prodotti filtrati contenuti in questo array osservabile.

Please help me out, Sto cercando di risolvere questo problema per due giorni di seguito, ma manca la conoscenza di javascript per capirlo. Grazie in anticipo!

risposta

6

prova ad aggiungere si applicano metodo:

var myArr = [ 
    [ 
     {"name":"product1","light":"1"}, 
     {"name":"product2","light":"2"}, 
     {"name":"product5","light":"5"}, 
     {"name":"product4","light":"4"} 
    ], 
    [ 
     {"name":"product2","light":"2"}, 
     {"name":"product3","light":"3"}, 
     {"name":"product4","light":"4"} 
    ] 
    ] 

    _.intersectionObjects = _.intersect = function(array) { 
    var slice = Array.prototype.slice; 
    var rest = slice.call(arguments, 1); 
    return _.filter(_.uniq(array), function(item) { 
     return _.every(rest, function(other) { 
     return _.any(other, function(element) { 
      return _.isEqual(element, item); 
     }); 
     }); 
    }); 
    }; 

    var myIntersection = _.intersectionObjects.apply(_, myArr); 

    for (var i = 0; i < myIntersection.length; i++) { 
    console.log(myIntersection[i]); 
    } 

    // Sample Output: 
    // Object {name: "product2", light: "2"} 
    // Object {name: "product4", light: "4"} 
+0

Grazie !!!!!!!! Cosa si applica fare? – Marz

+0

Applica: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply – WiredPrairie

1

Si rischia di imbattersi in errori se si sta confrontando solo gli oggetti stessi, in modo da restituire falso:

var o1 = {"foo":"bar"}; 
var o2 = {"foo":"bar"}; 
return o1 == o2; 

Avrete è necessario confrontare i valori all'interno degli oggetti e intersecarli in base a quelli:

Il JSFiddle qui fa quello che ti piace. http://jsfiddle.net/turiyag/bWrQW/6/

function valueIntersect(a1, a2) { 
    var aReturn = []; 
    for(i1 in a1) { 
     o1 = a1[i1]; 
     for (i2 in a2) { 
      o2 = a2[i2]; 
      if(equals(o1,o2)) { 
       aReturn.push(o1); 
       break; 
      } 
     } 
    } 
    return aReturn; 
} 

function equals(o1, o2) { 
    if (!o2 || o1.length != o2.length) { 
     return false; 
    } 
    for (i in o1) { 
     if (o1[i] !== o2[i]) { 
      return false; 
     } 
    } 
    return true; 
}; 
2

Ecco un metodo che ho usato che sembra funzionare bene.

var arr1 = [{"id":"1"},{"id":"2"},{"id":"3"}]; 
 
var arr2 = [{"id":"1"},{"id":"3"}]; 
 

 
function match(item){ 
 
var isMatch = _.matcher(item); 
 
var matches = _.filter(arr2, isMatch); 
 
    return matches[0]; 
 
} 
 

 
var matchArray = _.compact(_.map(arr1, function(val){ return match(val)})); 
 

 
document.write(JSON.stringify(matchArray));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Problemi correlati