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