2017-01-13 12 views
1

Ich habe zwei Arrays vereinfacht wie folgt.Filter-Objekt-Array gegen ein anderes Objekt-Array

var a = [{ 
number: 1, 
name: "A" 
}, { 
number: 2, 
name: "B" 
}, { 
number: 3, 
name: "C" 
}, { 
number: 4, 
name: "D" 
}, { 
number: 5, 
name: "E" 
}, { 
number: 6, 
name: "F" 
}]; 

var b = [{ 
number: 3, 
name: "C" 
}, { 
number: 6, 
name: "F" 
}]; 

Was ich will, ist ein Array zurückgeben, wo a gefiltert wird gegen b. Also das Ergebnis ist dies.

Haben viele andere Lösungen hier auf Stack-Überlauf geschaut, aber es kann nicht funktionieren.

Ich bin in Ordnung mit der Verwendung von Bibliotheken wie Unterstrich.

+0

was bedeutet "gefiltert gegen" bedeuten? willst du sie kombinieren? willst du alle Gegenstände in den Vesica-Fischen? Du willst einzigartige Gegenstände? klären. –

+0

Wenn Sie lodash (aktualisierter Unterstrich) verwenden, können Sie ihn einfach mit _.differenceBy() finden. Beachte meine Antwort –

Antwort

2
var a = [{ 
number: 1, 
name: "A" 
}, { 
number: 2, 
name: "B" 
}, { 
number: 3, 
name: "C" 
}, { 
number: 4, 
name: "D" 
}, { 
number: 5, 
name: "E" 
}, { 
number: 6, 
name: "F" 
}]; 

var b = [{ 
number: 3, 
name: "C" 
}, { 
number: 6, 
name: "F" 
}]; 

var _ = require('lodash'); 
var result = _.differenceBy(a,b,'name'); 

Weitere informaiton bitte Lodash Dokumentation: https://lodash.com/docs/#differenceBy

+1

was ist, wenn Autor nicht nur Name Feld überprüfen möchte? –

+2

@MaximKuzmin Ihre Lösung ist besser. –

+0

Also, um lodash zu verwenden, muss ich alle meine Unterstreichungsfunktionen ändern? Sieht nicht so aus, als würden sie zusammenarbeiten. – stibay

2

Sie können Array#filter verwenden. So etwas Ähnliches:

const filterData = (a,b) => { 
    return a.filter((itemA) => { 
     return b.some((itemB) => { 
      return (itemA.number === itemB.number); 
     }); 
    }); 
} 

Ich habe gerade eine Geige den Code zu testen: https://jsfiddle.net/mrlew/pb1qqeyd/3/ (Sie Konsole öffnen müssen Ergebnisse überprüfen).

Oder ... in einzeilige:

const filterData = (a,b) => a.filter((itemA) => b.some((itemB) => (itemA.number === itemB.number))); 

EDIT: Dank Vorschläge @kzh, herausgegeben .some zu verwenden.

+0

Du solltest wahrscheinlich 'some' anstelle von' forEach' verwenden, damit das ganze Array nicht iteriert wird. – kzh

+0

@kzh du hast Recht! bearbeitet! danke – mrlew

6

Es ist möglich, mit lodash durch die One-Line-Lösung zu erreichen.

var a = [{ 
 
number: 1, 
 
name: "A" 
 
}, { 
 
number: 2, 
 
name: "B" 
 
}, { 
 
number: 3, 
 
name: "C" 
 
}, { 
 
number: 4, 
 
name: "D" 
 
}, { 
 
number: 5, 
 
name: "E" 
 
}, { 
 
number: 6, 
 
name: "F" 
 
}]; 
 

 
var b = [{ 
 
number: 3, 
 
name: "C" 
 
}, { 
 
number: 6, 
 
name: "F" 
 
}]; 
 

 
var result = _.differenceWith(a, b, _.isEqual); 
 

 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

0

Sie können mit einfachen Javascript tun dies filter(), some() und every() verwenden.

var a = [{"number":1,"name":"A"},{"number":2,"name":"B"},{"number":3,"name":"C"},{"number":4,"name":"D"},{"number":5,"name":"E"},{"number":6,"name":"F"}] 
 
var b = [{"number":3,"name":"C"},{"number":6,"name":"F"}] 
 

 
var result = a.filter(function(o) { 
 
    return !b.some(function(e) { 
 
    return Object.keys(o).length == Object.keys(e).length && Object.keys(o).every(function(k) { 
 
     return e[k] == o[k] 
 
    }) 
 
    }) 
 
}) 
 

 
console.log(result)

0
var v1 = JSON.parse(a); 
var v2 = JSON.parse(b); 

var v3 = [] ; 


function objectEquals(v1, v2) { 

    if (typeof(v1) !== typeof(v2)) { 
     return false; 
    } 
if (v1 instanceof Object && v2 instanceof Object) { 

    for (k in v1) { 
      r = objectEquals(v1[k], v2[k]); 
      if (!r) { 
       v3.push(v1[k]); 

      } 
     } 



} 

} 

// call the above method passing your two object, and return a new unique array 


objectEquals(v1, v2) ; 
1

können Sie verwenden, um die in-built filter Funktion in JavaScript ein Array mit einem anderen Array zu filtern Überprüfen Sie das folgende Code-Snippet.

var a = [{ 
 
    number: 1, 
 
    name: "A" 
 
}, { 
 
    number: 2, 
 
    name: "B" 
 
}, { 
 
    number: 3, 
 
    name: "C" 
 
}, { 
 
    number: 4, 
 
    name: "D" 
 
}, { 
 
    number: 5, 
 
    name: "E" 
 
}, { 
 
    number: 6, 
 
    name: "F" 
 
}]; 
 

 
var b = [{ 
 
    number: 3, 
 
    name: "C" 
 
}, { 
 
    number: 6, 
 
    name: "F" 
 
}]; 
 

 
var result = a.filter(function(currentValue, index, arr) { 
 
    var found = false; 
 
    for (var i = 0; i < b.length; i++) { 
 
    if (currentValue.number === b[i].number) { 
 
     found = true; 
 
     break; 
 
    } 
 
    } 
 

 
    if (!found) { 
 
    return currentValue; 
 
    } 
 
}); 
 

 
console.log(result);