参见英文答案 >
Remove duplicates from an array of objects in JavaScript32个
我想获得具有唯一对象的数组.
我想获得具有唯一对象的数组.
说我有对象数组
[{"a":"b"},{"c":"d"},{"a":"b"}]
我想要数组的独特价值,即
[{"a":"b"},{"c":"d"}]
有没有最简单的方法来做到这一点.
解决方法
如果一次又一次地包含相同对象的数组,你可以做这样的函数:
var oa = {"a":"b"},ob = {"c":"d"}; var array = [oa,ob,oa]; function unique(a) { var arr = []; for(var i = 0; i < a.length; i++) { if( !arr.indexOf(a[i]) == -1 ) { arr.push(a[i]); } } return arr; }
但这很可能不会起作用,因为即使它们接缝相同的物体也是不同的:
alert( {a: 1} === {a: 1} ); // false
但:
var a = {a: 1}; alert( a === a ); // true
即使这样也是如此:
var a = {a: 1},b = a; alert( a === b ); // true
所以你也必须测试它(这是一个浅层的caparation.一个级别的对象):
function isEqual(a,b) { var prop; for( prop in a ) { if ( a[prop] !== b[prop] ) return false; } for( prop in b ) { if ( b[prop] !== a[prop] ) return false; } return true; }
我们还必须重写我们独特的功能:
function unique(a) { var isAdded,arr = []; for(var i = 0; i < a.length; i++) { isAdded = arr.some(function(v) { return isEqual(v,a[i]); }); if( !isAdded ) { arr.push(a[i]); } } return arr; }
完整代码:
var a = [{"a":"b"},{"a":"b"}],b = unique(a); // [{"a":"b"},{"c":"d"}] function unique(a) { var isAdded,a[i]); }); if( !isAdded ) { arr.push(a[i]); } } return arr; } function isEqual(a,b) { var prop; for( prop in a ) { if ( a[prop] !== b[prop] ) return false; } for( prop in b ) { if ( b[prop] !== a[prop] ) return false; } return true; }
注意某些方法的使用取决于ECMAScript第5版: