2017-06-04 50 views
0

我有一些數字或字符串的數組,例如。JavaScript - 比較兩個數組與有限的值/元素

[4.3, 1.2, 4.5, 3.9] 

['I', 'the', 'sheriff', 'shot'] 

在使用者重新安排在一個特定順序中的元素。例如,在一個升序排列:

[1.2, 3.9, 4.3, 4.5] 

,並建立一個有效的句子:

['I', 'shot', 'the', 'sheriff'] 

我有存儲在對象的預定義的答案。如何將數組與用戶生成的順序與元素順序正確的順序進行比較。我已經看到了有關如何比較數組的其他答案,但是我的問題並不需要廣泛的其他答案所包含的'如果...'。元素是由應用程序生成的,因此不會有意外的輸入,沒有未定義的值,沒有空元素等。用戶不輸入任何內容。他們只是重新安排這些元素的瓷磚。

比較陣列以確定用戶是否以正確方式重新排列框的最佳方式是什麼?

我第一次嘗試是不正確的,它似乎總是outputing「BINGO」即使順序不正確:

if (this.props.squares === correctOrder) { 
     console.log("BINGO"); 
    } 
+0

比較的第一要素,則第二元素,則第三元件,...如果所有元素匹配 - >賓果 – Andreas

回答

4

我會用every功能,所有陣列都有。

const isCorrect = this.props.squares.every((square, index) => 
    correctOrder[index] === square); 
1

最簡單的方法是通過所有的元素進行迭代和比較:

function arraysEqual(array1, array2) { 
    for(var i = array1.length; i--;) { 
     if(array1[i] !== array2[i]) 
      return false; 
    } 

    return true; 
} 

例:

arraysEqual(["I", "am", "well"], ["I", "am", "not", "well"]) // returns false 
arraysEqual(["I", "am", "well"], ["I", "am", "well"]) // returns true 

希望它能幫助。

2

您可以將想要的訂單存儲在一個對象中,其中第一個數組的值是鍵和排序後的索引值。

爲了檢查是否按照正確的順序,只需檢查items數組與對象值和實際索引。

var items = [1.2, 3.9, 4.3, 4.5], 
 
    order = items.reduce((o, k, i) => (o[k] = i, o), {}); 
 
    
 
// check 
 
items.every((k, i) => order[k] === i) && console.log('bingo');

+0

是逗號之前的 「o」 在(O [K] = I,O) 。當「i」有「i」值時,「i」是否在「o」之前被評估? – Rick

+1

@Arrow,它是一個逗號運算符,雖然我需要返回對象,但它首先評估賦值並返回最後一部分'o'。 –

0

如果你不介意使用lodash,這也可能是一種選擇。

_.isEqual(this.props.squares, correctOrder); 
相關問題