2016-05-06 20 views
6

Tôi đã 2 mảng của các đối tượng mà tôi muốn so sánh sâu sắc với lodashArray của đối tượng so sánh sâu sắc với lodash

Tuy nhiên, tôi đã là một prob với nó:

> 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 } ] 

Làm thế nào tôi nên so sánh để thấy rằng cả hai đều bình đẳng?

+0

mảng của mảng có thể sắp xếp. Mảng các đối tượng thì không. – Archer

Trả lời

12

Bạn có thể sử dụng differenceWith() với một bộ so sánh isEqual() và gọi isEmpty để kiểm tra xem chúng có bằng nhau hay không.

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

Cảm ơn @ryeballar. Về cơ bản tôi thực sự cần phải tìm 'diff' giữa chúng, vì vậy' _.difference' nên được thay thế bằng '_.differenceWith' bằng so sánh' _.isEqual'. – Archer

+1

Tôi chưa bao giờ thấy cú pháp cho '_ (foo)' được đề cập ở bất kỳ đâu trong lodash. Tài liệu này ở đâu? –

+1

@DonP Bạn có thể tham khảo [phần này của tài liệu lodash] (https://lodash.com/docs/4.17.4#lodash). – ryeballar

2

tôi thích JS thuần túy kể từ khi tôi đã không có đủ kiên nhẫn để học hỏi gạch chân hoặc lodash. Vì vậy, tôi phát minh ra một cái gì đó tôi đã mơ ước lâu dài. Object.prototype.compare(). Phiên bản v.2.0 chỉ làm việc so sánh nông cạn nhưng đầy đủ cho câu hỏi này.

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");

mát ... Vì vậy, sau đó cho phép tiếp tục với câu hỏi ... Tôi đoán ... vì chúng ta đã có một Object.prototype.compare() cần có hoàn toàn không có hại trong sự phát minh ra Array.prototype.compare(). Cho phép làm cho nó thông minh hơn thời gian này. Nó sẽ cho các nguyên thủy từ các đối tượng. Một điều nữa là, các mảng được sắp xếp; như vậy trong cuốn sách của tôi [1,2] không bằng [2,1]. Điều này cũng làm cho công việc đơn giản hơn.

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

Giải pháp của bạn trông thật tuyệt, cảm ơn. Tuy nhiên: 'đối tượng mới ({a: 1, b: 2, c: 3}) so sánh ({c: 3, b: 2, a: 1, d: 0}); ' trả về' true' , nhưng phải là 'false' cùng một vấn đề với so sánh đối tượng sâu. Tôi thích giải pháp 'lodash' hiện có. – Archer

+0

@Archer: hmm cool .. đó là lý do tại sao nó là v0.0.1. Dường như chúng ta phải thêm một kiểm tra cho 'Object.keys(). – Redu

+0

@Archer: đã khắc phục nhanh. Tôi đoán giai đoạn tiếp theo có thể là để làm cho nó lặn sâu đệ quy, tay để tay với nó đôi 'Array.prototype.compare() ' – Redu

Các vấn đề liên quan