2017-04-26 68 views
0

我目前正在研究一個小型家庭項目,我試圖將一個數組推入一個數組數組中,如果所述數組尚不存在於數組中陣列。推陣列如果數組不存在數組陣列

var arrayArr = [[1,4]]; 

function pushArr() { 

    var tempArr = [1, 3]; 
    var tempArr2 = [1, 4]; 

    for(i = 0; i < arrayArr.length, i++) 
     if(!arrayArr.indexOf(tempArr[i])) { 
      arrayArr.push(tempArr[i]); 
     } else { 
      //other logic 
     } 

    } 

現在,我知道這個例子在真實世界中並沒有什麼意義,它只是爲了說明我的擔憂。如何通過數組數組進行搜索以確保不會創建重複項。

如果您有任何問題,請詢問。

謝謝!

+0

應該'[1,4]'和'[4,1]'被視爲你的情況一樣的嗎? – RomanPerekhrest

+0

不,我不相信這是必要的,因爲我有一個有限陣列來推動,總是有相同的順序。 –

+0

在你的代碼中,你的狀態有一個小錯誤。請在'i

回答

2

在我的解決方案中,我在isArrayInArray()中循環遍歷主數組arrayArr中的每個元素。然後比較每個給定數組的第一個和第二個元素是否匹配。如果是這樣,數組已經被添加了,所以它會返回true。

var arrayArr = [[1, 4]]; 
 

 
pushArray([1, 4]); // does not get added 
 
pushArray([1, 3]); // gets added 
 

 
console.log(arrayArr); 
 

 
function isArrayInArray(arrayToSearch, arrayToFind) { 
 
    for (let i = 0; i < arrayToSearch.length; i++) { 
 
     if (arrayToSearch[i][0] === arrayToFind[0] && arrayToSearch[i][1] === arrayToFind[1]) { 
 
      return true; 
 
     } 
 
    } 
 

 
    return false; 
 
} 
 

 
function pushArray(array) { 
 
    if (!isArrayInArray(arrayArr, array)) { 
 
     arrayArr.push(array); 
 
    } 
 
}

+1

這隻測試每個數組的前兩個元素是否匹配,是否正確? (即它不適用於長度爲3或更長的數組) – apsillers

+0

@apsillers正確!它是在陣列只有長度爲2的假設下完成的。我可以修改這個函數是OP所需要的:) –

+1

是的,我只是想確保OP睜大眼睛進入這個;它確實可能正是他們所需要的。 ':)' – apsillers

0

即使你有以下:

let a = [1,2]; 
let b = [1,2]; 

兩個ab持有兩種不同的引用,以具有相同的數字陣列。他們不一樣!

let a = [1,2]; 
 
let b = [1,2]; 
 
console.log(a === b);

如果我們通過這個和我們假設我們的問題這兩個數組具有相同長度和相同的數據是一樣的,我們可以嘗試調用函數arrayCanBePushed ,在我們想要將一個數組添加到我們的數組數組中之前,如果它返回true,那麼我們可以繼續推送。

var arrayOfArrays = [[1,2],[2,3],[3,4,5],[7]]; 
 

 
function arrayCanBePushed(arr){ 
 
    return !arrayOfArrays.filter(a => a.length === arr.length) 
 
         .some(a => a.every(ele=>arr.includes(ele))); 
 
} 
 

 
console.log(arrayCanBePushed([1,2])); 
 
console.log(arrayCanBePushed([1,2,3]));

0

試圖保持回答儘可能簡單。基本上我們遍歷了arrayArr並檢查輸入數組的所有元素是否與元素數組的所有元素任何匹配。所以它應該只是一個嵌套在some中的every。但是,如果我們只是比較兩個元素的數組(數組到字符串的轉換應該非常快),您現在已經在您的答案中進行了澄清,然後我將使用字符串比較,如pushArr1中所示。這是您第一次嘗試的總體方向,因此我將其添加到了我的答案中。

var arrayArr = [[1, 3, 5]]; 
 
var tempArr = [1, 3, 5]; 
 
var tempArr2 = [1, 4]; 
 
pushArr1(tempArr); 
 

 
function pushArr(temp) 
 
{ 
 
    if(!arrayArr.some(function(e){ 
 
     return e.every(function(e1, i) 
 
     { 
 
      return e1 === temp[i]; 
 
     }) 
 
     })) arrayArr.push(temp); 
 
     
 
     console.log(arrayArr); 
 
} 
 

 

 
function pushArr1(temp) 
 
{ 
 
    if(!arrayArr.some(function(e){return e.join(",") === temp.join(",")})) arrayArr.push(temp); 
 

 
     console.log(arrayArr); 
 
}