/ / JavaScript / underscore / lodash: Porównywanie obiektu w tablicy obiektów i usuwanie dopasowanego obiektu - javascript, underscore.js, lodash

JavaScript / podkreślenie / lodash: Porównywanie obiektu w tablicy obiektów i usuwanie dopasowanego obiektu - javascript, underscore.js, lodash

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 № 1

Znalazł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