检查数组是否包含“等于”对象

时间:2019-04-02 19:38:46

标签: javascript arrays

这是一个简化的示例,但是我想在100x100的网格上生成5个唯一的位置。这些位置将存储在数组[[x,y],...]中。

尝试了一种显而易见的方法,即生成随机x和y并检查数组[x,y]是否已在结果数组中。如果是,则生成不同的值,如果没有,则将其添加到结果数组中。

result = [];
while (result.length !== 5) {
    let x = Math.floor(Math.random() * 100) + 1;
    let y = Math.floor(Math.random() * 100) + 1;
    if (!result.includes([x, y])) {
        result.push(array);
    }
}

但是,由于数组在技术上是不同的对象,因此将永远找不到重复项。那么,检测数组是否包含“相等”数组/对象的首选方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用some()代替includes(),并在比较之前使用join()

while (result.length !== 5) {
    let x = Math.floor(Math.random() * 10) + 1;
    let y = Math.floor(Math.random() * 10) + 1;
    if (!result.some(i => i.join() === [x, y].join())) {
        result.push(array);
    }
}

您无法通过js中的简单相等性来比较两个数组。例如,[]===[]false。因为两个数组都有不同的引用

console.log([] === []); //false

includes()就是这种情况

let pts = [[1,2],[5,6]];

console.log(pts.includes([1,2])); //false

console.log(pts.some(x => [1,2].join() === x.join())); //true

答案 1 :(得分:1)

您可以将Array.some()destructuring结合使用:

示例:

let arr = [[1,2],[3,4]];

console.log(arr.some(([x, y]) => x === 3 && y === 4));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

因此,您的示例可以修改为:

let result = [];

while (result.length !== 5)
{
    let x = Math.floor(Math.random() * 10) + 1;
    let y = Math.floor(Math.random() * 10) + 1;

    if (!result.some(([a, b]) => a === x && b === y))
    {
        result.push([x, y]);
    }
    else
    {
        console.log(`${[x,y]} is already on the array!`);
    }
}

console.log(JSON.stringify(result));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}