Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript如何在数组中查找对象的位置_Javascript_Arrays_Object - Fatal编程技术网

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

Javascript如何在数组中查找对象的位置,javascript,arrays,object,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); /

这是我的第一个问题,所以如果我有什么问题,请原谅

我有一个组织为对象的坐标数组,我需要找到并删除某个对象。我一直在尝试获取阵列中具有特定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


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

问题是
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;
}

您需要用一个循环来替换indexOf,该循环一次检查一个元素。这实际上就是indexOf函数中正在发生的情况,除了indexOf正在执行严格的三重相等(==)相等检查,除非对象是完全相同的对象,否则该检查对对象无效

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

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

indexOf
with object对您不起作用

我不会遍历所有数组来查找对象,因为它的复杂性为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美分

祝你好运。

正如Mozilla所说:

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

三重相等不做深入的对象比较,它通过引用进行比较。 您可以将代码重新分解为:

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;
}
door_数组=[{x:3,y:4},{x:12,y:12},{x:15,y:15}];
功能移除门(dx、dy、阵列)
{
var obj={x:dx,y:dy};
对于(变量i=0;i
您可以迭代每个对象,并使用
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);
door_数组=[{x:3,y:4},{x:12,y:12},{x:15,y:15}];
功能移除门(dx、dy、阵列)
{
var obj={x:dx,y:dy};

对于(i=0;i检查您的浏览器控制台

问题是您正在创建一个新对象(与您正在查找的对象具有相同的值)。但这不是同一个对象。您可能需要按值或id进行筛选。
{x:4}===={x:4}//false
使用indexOf(对象)通过引用(或指针)进行比较这就是它失败的原因。
if
主体应该在作为参数传递的
array
上运行,而不是在
door\u array
上运行,您应该返回
array
,因为
slice
没有在适当的位置运行,非常感谢您(所有花时间回答的人)。它现在返回正确的值(索引),但由于某些原因,它没有从数组中删除对象。我将array.slice更改为array.splice,现在它可以正常工作,尽管我不知道为什么slice没有这样做。很高兴你找到了它!谢谢,我已经从前面的答案中找到了它,但会记住此方法。好的,没有问题。检查此方法。如果你有任何问题,请检查怀疑,就问我:)
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);