2013-08-22 4 views
5

Ho 2 array, uno è newVal e l'altro è origVal definireConfronta 2 array di oggetti con sottolineatura per trovare la differnce

orig:

[ 
{"ListingId":1762276,"Rating":3,"ListPrice":7411828,"PropertyType":"Residential"}, 
{"ListingId":1826692,"Rating":3,"ListPrice":650000,"PropertyType":"Residential"}, 
{"ListingId":1833283,"Rating":4,"ListPrice":950000,"PropertyType":"Residential"}, 
{"ListingId":1832134,"Rating":3,"ListPrice":850000,"PropertyType":"Residential"}, 
{"ListingId":1829932,"Rating":4,"ListPrice":750000,"PropertyType":"Residential"}, 
{"ListingId":1827548,"Rating":5,"ListPrice":650000,"PropertyType":"Residential"} 
] 

nuovo:

[ 
{"ListingId":1762276,"Rating":2,"ListPrice":7411828,"PropertyType":"Residential"}, 
{"ListingId":1826692,"Rating":3,"ListPrice":650000,"PropertyType":"Residential"}, 
{"ListingId":1833283,"Rating":4,"ListPrice":950000,"PropertyType":"Residential"}, 
{"ListingId":1832134,"Rating":3,"ListPrice":850000,"PropertyType":"Residential"}, 
{"ListingId":1829932,"Rating":4,"ListPrice":750000,"PropertyType":"Residential"}, 
{"ListingId":1827548,"Rating":5,"ListPrice":650000,"PropertyType":"Residential"} 
] 

Se cambio uno dei voti in un nuovo, come posso rilevare quel cambiamento e recuperare l'oggetto modificato?

Ci sarà un solo cambiamento alla volta, anche se non credo che importi.

FYI: Questi array vengono prodotte da un watchcollection Anjularjs

$scope.$watchCollection('items', function (new, old) { 

}, true); 

Grazie, Stephen

+0

Sono quelli gli stessi oggetti della serie (vale a dire '' === identità) o sono solo simili di aspetto? – Bergi

+0

Di quale risultato hai bisogno? L'indice dell'oggetto modificato nella matrice, il nuovo oggetto modificato, il vecchio oggetto modificato, la valutazione? – Bergi

+0

Preferirei l'oggetto modificato ie {"ListingId": 1762276, "Rating": 2, "ListPrice": 7411828, "PropertyType": "Residential"} –

risposta

10

Date un'occhiata a questo:

var a = [ 
{"ListingId":1762276,"Rating":3,"ListPrice":7411828,"PropertyType":"Residential"}, 
{"ListingId":1826692,"Rating":3,"ListPrice":650000,"PropertyType":"Residential"}, 
{"ListingId":1833283,"Rating":4,"ListPrice":950000,"PropertyType":"Residential"}, 
{"ListingId":1832134,"Rating":3,"ListPrice":850000,"PropertyType":"Residential"}, 
{"ListingId":1829932,"Rating":4,"ListPrice":750000,"PropertyType":"Residential"}, 
{"ListingId":1827548,"Rating":5,"ListPrice":650000,"PropertyType":"Residential"} 
]; 

var b = [ 
{"ListingId":1762276,"Rating":2,"ListPrice":7411828,"PropertyType":"Residential"}, 
{"ListingId":1826692,"Rating":3,"ListPrice":650000,"PropertyType":"Residential"}, 
{"ListingId":1833283,"Rating":4,"ListPrice":950000,"PropertyType":"Residential"}, 
{"ListingId":1832134,"Rating":3,"ListPrice":850000,"PropertyType":"Residential"}, 
{"ListingId":1829932,"Rating":4,"ListPrice":750000,"PropertyType":"Residential"}, 
{"ListingId":1827548,"Rating":5,"ListPrice":650000,"PropertyType":"Residential"} 
] 

var difference = function(array){ 
    var rest = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1)); 

    var containsEquals = function(obj, target) { 
    if (obj == null) return false; 
    return _.any(obj, function(value) { 
     return _.isEqual(value, target); 
    }); 
    }; 

    return _.filter(array, function(value){ return ! containsEquals(rest, value); }); 
}; 

console.log(JSON.stringify(difference(b, a))); 
> [{"ListingId":1762276,"Rating":2,"ListPrice":7411828,"PropertyType":"Residential"}] 

Il codice si basa sulla funzione originale difference da sottolineatura, ma svolge un profondo confronto tra oggetti utilizzando isEqual .

+0

E grazie per il suggerimento di debugging con JSON.stringify –

+1

È brillante , cosa fa. Vorrei poter capire il codice. – mcktimo

3

Se l'ordine non cambia, una semplice iterazione lo farà. Underscore prevede la find method per questo compito:

var changedObj = _.find(newVal, function(obj, index) { 
    return obj.Rating != oldVal[index].Rating; 
}); 
0

ne dite:

const current = [{name:'a'},{name:'b'},{name:'c'}] 
const update = [{name:'x'},{name:'a'},{name:'b'},{name:'f'}] 
const records = current.concat(update); 
const diff = {}; 
diff.in = [] 
diff.out = []; 
records.forEach(item => { 
    if(!current.find(cur => item.name == cur.name))diff.in.push(item) 
    if(!update.find(up => item.name == up.name))diff.out.push(item) 
})