删除数组中重复的未排序对象
Remove duplicate unsorted objects in an array
我有一个这样的数组:
[1, {a: 'b', c: 'd'}, {c: 'd', a: 'b'}, {e: 'f'}, 'b']
我想做的是我想从这个数组中删除重复项,无论它们是否是对象,以便最终的数组可以变成这样:
[1, {a: 'b', c: 'd'}, {e: 'f'}, 'b']
我在网站上看到了很多解决方案,但没有一个适用于我的问题。我该怎么做?
我试过这个:
function uniq_fast(a) {
var seen = {};
var out = [];
var len = a.length;
var j = 0;
for(var i = 0; i < len; i++) {
var item = a[i];
if(seen[item] !== 1) {
seen[item] = 1;
out[j++] = item;
}
}
return out;
}
但这也删除了第三个对象。
谢谢。
如果只想比较引用而不是对象的内容,则可以使用:
arr.reduce(function(accumulator, element){
if (accumulator.indexOf(element) !== -1) return accumulator;
return accumulator.concat(element);
}, []);
否则,您需要创建一个函数来比较对象的内容,例如:
function objectsMatch(obj1, obj2) {
if (obj1 === obj2) return true;
for (var prop in obj1) {
if (!(prop in obj2) || obj1[prop] !== obj2[prop]) return false;
}
for (var prop in obj2) {
if (!(prop in obj1)) return false;
}
return true;
}
然后使用类似以下内容:
arr.reduce(function(accumulator, element){
if (accumulator.some(function(otherElement){
return objectsMatch(element, otherElement);
})) return accumulator;
return accumulator.concat(element);
}, []);
这个函数会为你做。它使用Object.keys()
交叉引用对象。如果使用已知键填充 seen,并且已知键内容是 seen 中对象的两倍,则从对象中删除属性。最后,如果对象为空,则使用拼接从数组中删除整个对象。请注意,仅当所有输入都与提供的示例类似时,此解决方案才有效。否则,该函数需要递归编写。
var abc = [1, {a: 'b', c: 'd'}, {c: 'd', a: 'b'}, {e: 'f'}, 'b'];
function uniq_fast(a) {
var seen = {};
var deleteObject = [];
var len = a.length;
for(var i = 0; i < len; i++) {
if (Object.prototype.toString.call(a[i]) === '[object Array]' || Object.prototype.toString.call(a[i]) === '[object Object]')
{
var test = Object.keys(a[i]);
var len2 = test.length;
for (var j = 0; j < len2; ++j)
{
if (seen[test[j]] && a[i][test[j]] === seen[test[j]])
{
delete a[i][test[j]];
}
else
{
seen[test[j]] = a[i][test[j]];
}
}
if (Object.keys(a[i]).length == 0)
{
deleteObject.push(i);
}
}
}
for (var i = 0; i < deleteObject.length; ++i)
{
a.splice(deleteObject[i], 1);
}
return a;
}
console.log(uniq_fast(abc));
相关文章:
- 在循环Handlebars之前重新排序对象键
- 将SortedMap从Java转换为Javascript中可读的排序对象
- 模仿`overflow-y:auto;overflow-x:visible `在jQuery UI可排序对象上
- Javascript排序对象日期
- Jquery UI:如何指示可拖动对象成功拖放到可排序对象上
- 删除数组中重复的未排序对象
- Javascript 递归地排序对象和嵌套对象以及数组
- 如何在目标可排序对象接收后获取拖动项的类
- Javascript:排序对象挑战
- 在 JavaScript 中合并多个排序对象数组的最有效方法是什么?
- 如何在角度UI中加载保存的可排序对象
- 任意重新排序和排序对象文字的 JavaScript 数组
- 使用下划线在javascript中重新排序对象
- 排序对象的多维数组与一个可变的深度在Javascript
- 在javascript中,排序对象不会传递给字符串变量
- JavaScript快速排序对象
- 在JavaScript数组中按键值排序对象
- 用布尔值排序对象
- 如何在D3.js中通过JSON文件解析按键排序对象
- Javascript如何按键排序对象,但不破坏原始对象的顺序