Question Exclure certaines propriétés en comparaison en utilisant isEqual () de lodash


j'utilise _.est égal cela compare 2 tableaux d'objets (ex: 10 propriétés par objet), et ça marche bien.

Maintenant, il y a 2 propriétés (création et suppression) que je n'ai pas besoin de faire partie de la comparaison.

Exemple:

var obj1 = {name: "James", age: 17, creation: "13-02-2016", deletion: "13-04-2016"}
var obj2 = {name: "Maria", age: 17, creation: "13-02-2016", deletion: "13-04-2016"}

// lodash method...
_.isEqual(firstArray, secondArray)

15
2018-06-20 12:46


origine


Réponses:


Vous pouvez utiliser omettre() pour supprimer des propriétés spécifiques dans un objet.

var result = _.isEqual(
  _.omit(obj1, ['creation', 'deletion']),
  _.omit(obj2, ['creation', 'deletion'])
);

var obj1 = {
  name: "James",
  age: 17,
  creation: "13-02-2016",
  deletion: "13-04-2016"
};

var obj2 = {
  name: "Maria",
  age: 17,
  creation: "13-02-2016",
  deletion: "13-04-2016"
};

var result = _.isEqual(
  _.omit(obj1, ['creation', 'deletion']),
  _.omit(obj2, ['creation', 'deletion'])
);

console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>


35
2018-06-21 03:06



Vous pourriez carte votre tableau dans un tableau "nettoyé", puis comparez-les.

// Create a function, to do some cleaning of the objects.
var clean = function(obj) {
    return {name: obj.name, age: obj.age};
};

// Create two new arrays, which are mapped, 'cleaned' copies of the original arrays.
var array1 = firstArray.map(clean);
var array2 = secondArray.map(clean);

// Compare the new arrays.
_.isEqual(array1, array2);

Cela a l'inconvénient que le clean La fonction devra être mise à jour si les objets attendent de nouvelles propriétés. Il est possible de l'éditer pour supprimer les deux propriétés indésirables.


3
2018-06-20 13:02



La réponse de @ryeballar n'est pas idéale pour les gros objets, car vous créez une copie complète de chaque objet chaque fois que vous faites la comparaison.

Il vaut mieux utiliser isEqualWith, par exemple.

var result = _.isEqualWith(obj1, obj2, (value1, value2, key) => {
    return key === "creation" || key === "deletion" ? true : undefined;
});

Notez que si vous écrivez pour ES5 et versions antérieures, vous devrez remplacer la syntaxe de la flèche (() => {) avec la syntaxe de la fonction (function() {)


2
2018-05-16 15:40



Je vois deux options.

1) Faites une deuxième copie de chaque objet qui ne contient pas la création ou la date.

2) Faites une boucle à travers toutes les propriétés et, en supposant que vous soyez certain qu’elles ont les mêmes propriétés, essayez quelque chose comme ça.

var x ={}
var y ={}
for (var property in x) {
if(property!="creation" || property!="deletion"){
if (x.hasOwnProperty(property)) {
        compare(x[property], y[property])
    }
}
}

Où compare () est une simple comparaison de chaîne ou d'objet. Si vous êtes certain des propriétés sur un ou les deux objets, vous pouvez simplifier un peu ce code, mais cela devrait fonctionner dans la plupart des cas.


0
2018-06-20 13:04