Mam na tablicy obiektu, który wygląda następująco:
var arrayOfObjects = [
{
key_a : "value1",
key_b : "value2"
},
{
key_c : "value12",
key_d : "value23"
}
];
Teraz mam inny przedmiot:
var objToCompare = {
key_a : "value1",
key_b : "value2"
};
Jakie są możliwe sposoby porównania „objToCompare” z „arrayOfObjects” i usunięcia pasujących obiektów z „arrayOfObjects” - przy użyciu javascript lub podkreślenia js lub lodash?
Tak więc wynikowa tablica obiektów wyglądałaby następująco:
var arrayOfObjects = [
{
key_c : "value12",
key_d : "value23"
}
];
* Obiekt należy usunąć z tablicy obiektów tylko wtedy, gdy wszystkie właściwości są dopasowane.
Odpowiedzi:
2 dla odpowiedzi № 1Znalazłem prosty sposób na rozwiązanie twojego problemu. Konwertuj objectToCompare na tablicę i używając _.differenceWith()
porównywać.
Sprawdź mój kod poniżej.
var _ = require("lodash")
var arrayOfObjects = [
{
key_a : "value1",
key_b : "value2"
},
{
key_c : "value12",
key_d : "value23"
}
]
var objToCompare = {
key_a : "value1",
key_b : "value2"
}
var arrayToCompare = []
arrayToCompare.push(objToCompare)
var result = _.differenceWith(arrayOfObjects, arrayToCompare, _.isEqual)
console.log(result)
1 dla odpowiedzi nr 2
Wersja czystego javascript
var arrayOfObjects = [{
key_a: "value1",
key_b: "value2"
},
{
key_c: "value12",
key_d: "value23"
}
];
var objToCompare = {
key_a: "value1",
key_b: "value2"
};
// credits https://stackoverflow.com/a/6713782/2308005
function objectEquals(x, y) {
if (x === y) return true;
if (!(x instanceof Object) || !(y instanceof Object)) return false;
if (x.constructor !== y.constructor) return false;
for (var p in x) {
if (!x.hasOwnProperty(p)) continue;
if (!y.hasOwnProperty(p)) return false;
if (x[p] === y[p]) continue;
if (typeof(x[p]) !== "object") return false;
if (!Object.equals(x[p], y[p])) return false;
}
for (p in y) {
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) return false;
}
return true;
}
var result = arrayOfObjects.filter(function(item) {
return !objectEquals(item, objToCompare);
});
console.log(result);
1 dla odpowiedzi nr 3
Możesz po prostu użyć metody _.reject i _.isEqual. Jest to prawie dokładnie przeciwne do metody _.where w Underscore / Lodash.
let result = _.reject(arrayOfObjects, (obj) => _.isEqual(obj, objToCompare))
0 dla odpowiedzi nr 4
Powinien być tak prosty jak:
arrayOfObjects.filter((item) => !(item.key_a === objToCompare.key_a && item.key_b === objToCompare.key_b))
Edytować: FWIW: Jest to czyste rozwiązanie JavaScript, które robi tylko to, co robi wymagania do i nie odtwarza skutecznie lodash / podkreślenia isEqual