0

我正在尝试创建一个具有唯一对象的数组。我有一个锦标赛的 json 数据,我想按池订购。每场比赛都有自己的池数据,因此他会将每场比赛的池数据推送到数组中。这将创建一个包含 5 个相同池值的数组。这是我的代码:

var arr = [];
for (var i = 0; i < data.objects.length; i++){
    obj = {
        poolId: data.objects[i].pool.id,
        poolLetter: data.objects[i].pool.name
    };

    if (arr.indexOf(obj) == -1) {
        arr.push(obj); 
    }else{} 
}
4

4 回答 4

1

问题是obj您在循环中生成的对象不会是arr数组中的同一个对象,它们将具有不同的签名,因此您不能indexOf在这种情况下使用。

相反,您将不得不遍历arr数组以查看是否可以找到任何具有相同poolIdor的元素poolLetter

var arr = [];
for (var i = 0; i < data.objects.length; i++){
    obj = {
        poolId: data.objects[i].pool.id,
        poolLetter: data.objects[i].pool.name
    };

    // Do the insert if arr doesn't already contain this poolId    
    if(!arrayContains(arr, obj.poolId)) arr.push(obj);
}

// Helper function to find an instance of poolId in the given array
function arrayContains(arr, poolId) {
    for(var x = 0; x < arr.length; x++) {
        if(arr[x].poolId === poolId) {
            return true;
        }
    }
    return false;
}

这是一个演示上述内容的小提琴。

于 2013-10-25T12:24:23.517 回答
0

您可以使用数组原型。只是传递对象。

Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
    if (this[i] === obj) {
        return true;
    }
}
return false;
}

使用以下

alert([1, 2, 3].contains(2)); //true
alert([1, 2, 3].contains('2')); //false
于 2013-10-25T12:28:49.887 回答
0

indexOf 使用严格相等将 searchElement 与 Array 的元素进行比较(与 === 或三等号运算符使用的方法相同)。

然后

var obj1 = { a:1};

var obj2 = { a:1};

obj1 === obj2; // wrong

当您编写 "var obj1={a:1}" 时,javascript 创建一个新对象。

于 2013-10-25T12:36:10.890 回答
0

还有一个 jQuery 解决方案。我知道您没有要求 jQuery 答案。但也许你想使用它。

jQuery.inArray() 返回指定值的索引,如果没有找到则返回 -1。

http://api.jquery.com/jQuery.inArray/

于 2013-10-25T12:37:49.357 回答