Javascript如何在数组中查找对象的位置

时间:2014-11-11 18:01:26

标签: javascript arrays object

这是我的第一个问题,如果我出错了,请原谅我。

我有一个组织为对象的坐标数组,我需要找到并删除某个对象。我试图通过数组中的特定x和y坐标来获取对象的位置。

这是我到达的地方:

door_array = [{x:3, y:4},{x: 12,y: 12}, {x: 15,y:15}];

function remove_door(dx,dy, array) 
{
    var obj = {x:dx,y:dy};  
    var a = door_array.indexOf(obj); //this part doesn't work
    door_array.slice(a,1)   

}

当我尝试调用该函数时,它似乎将数组读取为[object,object,object],并返回-1。

问题是,如何通过它的坐标找到特定对象的位置,以便我可以将其删除?

5 个答案:

答案 0 :(得分:2)

问题是obj是与列表中的对象不同的对象。您应该遍历列表中的对象,直到找到所需的对象。实施例

door_array = [{x:3, y:4},{x: 12,y: 12}, {x: 15,y:15}];

function remove_door(dx,dy, array) 
{
    var index = -1;
    for(var i = 0; i < array.length; i++)
    {
        if(array[i].x == dx && array[i].y == dy)
        {
            index = i;
            break;
        }
    }
    if(index != -1)
    {
        array.slice(index,1);
    } 
    return array;
}

完成操作后应该返回数组。像这样打电话:

door_array = remove_door(x, y, door_array);

答案 1 :(得分:0)

您需要将indexOf替换为一次检查每个元素的循环。这实际上是indexOf函数中发生的事情,除了indexOf正在进行严格的,三等于(===)相等检查,它不会对一个对象起作用,除非它完全相同。

var x = {};
var y = {};

y === x; // false
x === x; // true

答案 2 :(得分:0)

带对象的

indexOf对你不起作用。

我不会遍历所有数组来查找对象,因为它的复杂性为O(n)。

我建议创建一个地图,其中键为x_y,值为对象本身, 这样的事情对你有用:

var map = {};
map["3_4"] = {x:3, y:4};
map["2_12"] = {x:2, y:12};

// then you can get the value with O(1)
var requiredValue = map[dx + "_" + dy];

那只是我的2美分。

祝你好运。

答案 3 :(得分:0)

作为Mozilla describes

  

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

并且三等于不进行深度对象比较,它通过引用进行比较。 您可以将代码重新计算为:

door_array = [{x:3, y:4},{x: 12,y: 12}, {x: 15,y:15}];

function remove_door(dx,dy, array) 
{
    var obj = {x:dx,y:dy};
    for (var i = 0; i < door_array.length; i++){
       if(door_array[i].x === obj.x && door_array[i].y === obj.y)
          return i;
    }
    return -1;
}

答案 4 :(得分:0)

您可以使用splice方法

遍历每个对象并删除它们
door_array = [{x:3, y:4},{x: 12,y: 12}, {x: 15,y:15}];

function remove_door(dx,dy, arrays) 
{
    var obj = {x:dx,y:dy};
    for(i=0; i<arrays.length; i++){

    var a = arrays[i]; 

        if(a.x == obj.x && a.y == obj.y){
        console.log('found');
            arrays.splice(i,1);
        }

        }
    console.log(arrays);
    return arrays;


}
remove_door(12,12,door_array);

Jsfiddle 检查您的浏览器控制台