Javascript 复制对象数组的免费版本
我实现了一个函数,该函数创建了一个数组的无副本版本,但它不适用于对象数组。我不明白,也找不到如何修复它的信息 我的职能:Javascript 复制对象数组的免费版本,javascript,arrays,object,Javascript,Arrays,Object,我实现了一个函数,该函数创建了一个数组的无副本版本,但它不适用于对象数组。我不明白,也找不到如何修复它的信息 我的职能: function uniq(array) { var length = array.length; if (!length) { return; } var index = 0; var result = []; while (index < length) { var current
function uniq(array) {
var length = array.length;
if (!length) {
return;
}
var index = 0;
var result = [];
while (index < length) {
var current = array[index];
if (result.indexOf(current) < 0) {
result.push(current);
}
index++;
}
return result;
}
您知道有人如何创建对象数组的重复免费版本吗?javascript中的indexOf()不会对对象执行深度比较。除此之外,创建的任何两个对象都不会彼此“相等”。如果您这样做:
var a = {};
var b = {};
a == b; //false
a === b; //false
您需要对所有值进行深入比较(如果这是您想要做的,因为您可能还需要其他等式)。我将不讨论如何进行深入的比较,因为Google。如果对象不是巨大的,数组没有大量的元素,如果对象不包含引用循环,那么解决方案是使用
JSON.stringify
来确定两个对象是否相等
function uniq(A) {
var seen = {};
var result = [];
A.forEach(function(x) {
var str = "" + JSON.stringify(x);
if (!seen[str]) {
seen[str] = 1;
result.push(x);
}
});
return result;
}
由于这些对象只是用于数据存储(即,它们没有应用于它们的方法或原型扩展),我可能建议序列化和散列数组中的每个对象,并将散列存储在对象中以确定唯一性。现在的问题是使用哪个散列函数。有许多md5和SHA-256实现可用(为此搜索StackOverflow)。我的示例将假定存在一个名为
hashFunction()
的哈希函数
您需要通过比较每个对象的属性来进行深入比较。因为第二个和第三个对象不是同一个对象。它们是两个独立的对象,恰好具有相同的属性。对于对象检查引用和引用,通常不同的JS对象是按引用比较的,而不是按其内容比较的。因此,不能对对象使用
indexOf
。正如@Matt Burland所指出的,您必须进行深入的比较。一个选择是使用递归函数。@MattBurland谢谢,伙计们!
function uniq(A) {
var seen = {};
var result = [];
A.forEach(function(x) {
var str = "" + JSON.stringify(x);
if (!seen[str]) {
seen[str] = 1;
result.push(x);
}
});
return result;
}
function uniqArrayObjects(array) {
// make sure we have an array
if(Array.isArray(array) === false) {
console.log('Doh! No array passed.');
return null;
}
var length = array.length;
// you can return input array if it has 0 or 1 items in it
// it is already unique
if (length === 0 || length === 1) {
return array;
}
// object for storing hashes
var hashTable = {};
// filter and return the array
return array.filter(function(obj) {
var json = JSON.stringify(obj);
var hash = hashFunction(json);
if (typeof hashTable[hash] === undefined) {
// this item doesn't exist in hash table yet
// add to hash table and return true to add this to filtered result
hashTable[hash] = 1; // value doesn't matter here
return true;
} else {
return false;
}
});
}