簡體   English   中英

Javascript如何在數組中找到對象的位置

[英]Javascript how to find the position of an object in an array

這是我的第一個問題,請原諒我做錯了什么。

我有一組作為對象組織的坐標,我需要查找和刪除某個對象。 我一直在試圖獲取具有特定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;
}

完成操作后,應該返回數組。 像這樣打電話:

door_array = remove_door(x, y, door_array);

您將需要用一個循環將indexOf替換,該循環一次檢查每個元素。 實際上,這就是indexOf函數中發生的事情,只是indexOf進行了嚴格的三等式(===)相等檢查,除非對象完全相同,否則它不適用於一個對象。

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

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

帶對象的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美分。

無論如何,祝你好運。

正如Mozilla 所描述的那樣

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

您可以遍歷每個對象並使用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檢查您的瀏覽器控制台

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM