5

Ich kann nicht herausfinden, wie die Kreuzung dieses Satzes von Arrays zu finden:Wie finde ich den Schnittpunkt eines Arrays von Arrays, die Objekte mit Javascript/undercorejs enthalten?

[ 
[ 
    {"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] 
] 

Dies ist nur Beispieldaten, die reale Set Ich habe viel verändert, aber mit dieser Struktur. Ich möchte, dass die zurück Kreuzung wie folgt aus (ein einzelnes Array der durchteuft Objekte) suchen:

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

ich schon versucht, diese zusammen mit LoDashjs und Underscore.js:

_.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); }); 
    }); 
}); 
}; 

ich das brauche, weil ich versuche zu Erstellen Sie ein Tag-System mit knockoutjs. Ich habe ein Layout von kategorisierten Tag-Buttons, die beim Klick auf ein beobachtbares "Filter" -Array schreiben, das einzige, was übrig bleibt, ist die Schnittmenge der gefilterten Produkte, die in diesem beobachtbaren Array enthalten sind.

Bitte helfen Sie mir, ich habe versucht, dies für zwei Tage gerade zu lösen, aber fehlt das Javascript-Wissen, um es herauszufinden. Danke im Voraus!

Antwort

6

Versuchen Sie, sie gelten Methode:

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

Danke !!!!!!!! Was trifft zu? – Marz

+0

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

1

Sie wahrscheinlich sind, über Fehler laufen, wenn Sie nur die Objekte selbst zu vergleichen, da diese falsch zurück:

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

Sie über müssen die Werte innerhalb der Objekte vergleichen und sich basierend darauf schneiden:

Der JSFiddle hier tut was du willst. 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

Hier ist eine Methode, die ich verwendet, das scheint gut zu funktionieren.

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>