2016-05-06 26 views
6

mam 2 tablicę obiektów, które bym głęboko porównania z lodashArray obiektów głębokiego stosunku lodash

Jednak mam prob z nim:

> var x = [{a:1, b:2}, {c:3, d:4}]; 
> var y = [{b:2, a:1}, {d:4, c:3}]; 
> _.difference(x,y, _.isEqual); 
[ { a: 1, b: 2 }, { c: 3, d: 4 } ] 

Jak należy porównać zobaczyć, że oba są równe?

+0

tablicy tablic można sortować. Tablica obiektów nie jest. – Archer

Odpowiedz

12

Możesz użyć differenceWith() z kompilatorem isEqual() i wywołać isEmpty, aby sprawdzić, czy są one równe, czy nie.

var isArrayEqual = function(x, y) { 
 
    return _(x).differenceWith(y, _.isEqual).isEmpty(); 
 
}; 
 

 
var result1 = isArrayEqual(
 
    [{a:1, b:2}, {c:3, d:4}], 
 
    [{b:2, a:1}, {d:4, c:3}] 
 
); 
 

 
var result2 = isArrayEqual(
 
    [{a:1, b:2, c: 1}, {c:3, d:4}], 
 
    [{b:2, a:1}, {d:4, c:3}] 
 
); 
 

 
document.write([ 
 
    '<div><label>result1: ', result1, '</label></div>', 
 
    '<div><label>result2: ', result2, '</label></div>', 
 
].join(''));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.11.2/lodash.js"></script>

+0

Dzięki @ryeballar. Zasadniczo naprawdę muszę znaleźć "diff" między nimi, więc '_.difference' powinno być po prostu zastąpione' _.differenceWith' kompilatorem '_.isEqual'. – Archer

+1

Nigdy nie widziałem składni dla '_ (foo)' w dowolnym miejscu w lodash. Gdzie to jest w dokumentach? –

+1

@DonP Możesz odnieść się do [tej części dokumentacji Lilla] (https://lodash.com/docs/4.17.4#lodash). – ryeballar

2

Wolę czyste JS ponieważ nie mam cierpliwości do nauki podkreślenia lub lodash. Więc wymyślam coś, o czym od dawna marzyłem. Object.prototype.compare(). W0.0.2 robi tylko płytkie porównanie, ale wystarczające dla tego pytania.

Object.prototype.compare = function(o){ 
 
    var ok = Object.keys(this); 
 
    return typeof o === "object" && ok.length === Object.keys(o).length ? ok.every(k => this[k] === o[k]) : false; 
 
}; 
 
var obj1 = {a:1,b:2,c:3}, 
 
    obj2 = {c:3,a:1,b:2}, 
 
    obj3 = {b:2,c:3,a:7}; 
 

 
document.write ("<pre>" + obj1.compare(obj2) + "</pre>\n"); 
 
document.write ("<pre>" + obj2.compare(obj3) + "</pre>\n"); 
 
document.write ("<pre>" + new Object({a:1, b:2, c:3}).compare({c:3,b:2,a:1,d:0}) + "</pre>\n");

cool ... Więc pozwala kontynuować pytanie ... Chyba ... skoro mamy już Object.prototype.compare() nie powinno być absolutnie nic złego w wynalezieniu Array.prototype.compare(). Tym razem sprawimy, że będzie to bardziej sprytne. Powinien powiedzieć prymitywom z przedmiotów. Kolejną rzeczą jest uporządkowanie tablic; więc w mojej książce [1,2] nie jest równa [2,1]. To także ułatwia pracę.

Object.prototype.compare = function(o){ 
 
    var ok = Object.keys(this); 
 
    return typeof o === "object" && ok.length === Object.keys(o).length ? ok.every(k => this[k] === o[k]) : false; 
 
}; 
 
Array.prototype.compare = function(a){ 
 
    return this.every((e,i) => typeof a[i] === "object" ? a[i].compare(e) : a[i] === e); 
 
} 
 
var x = [{a:1, b:2}, {c:3, d:4}], 
 
    y = [{b:2, a:1}, {d:4, c:3}], 
 
    a = [1,2,3,4,5], 
 
    b = [1,2,3,4,5], 
 
    p = "fourtytwo", 
 
    r = "thirtyseven", 
 
    n = 42, 
 
    m = 37; 
 
document.writeln(x.compare(y)); // the question is answered here 
 
document.writeln(a.compare(b)); 
 
document.writeln(p.compare(r)); // these primitives end up at Object prototype 
 
document.writeln(n.compare(m)); // so modify Object.prototype.compare() accordingly

+0

Twoje rozwiązanie wygląda świetnie, dzięki. Jednak: 'nowy obiekt ({a: 1, b: 2, c: 3}). Porównać ({c: 3, b: 2, a: 1, d: 0});' zwraca "prawda" , ale powinno być "fałszywe" Te same problemy z porównaniem głębokich obiektów. Wolałbym istniejący roztwór 'lodash'. – Archer

+0

@Archer: hmm fajnie .. dlatego to v0.0.1. Wygląda na to, że musimy dodać kontrolę dla etapu 'Object.keys(). Length'. – Redu

+0

@Archer: zrobiłem szybką naprawę. Sądzę, że następny etap może sprawić, że zanurkuje on głębiej rekurencyjnie, ręka w rękę z jego bliźniaczym 'Array.prototype.compare()' – Redu