2015-11-29 36 views
-2

我是一個JavaScript的新手。我以前曾使用其他編程語言(C,C++等)。我不明白a[arr1[i]]=true;正在做什麼。請幫我理解它。謝謝。[arr1 [i]] = true是做什麼用的?

function diff(arr1, arr2) { 
    var newArr = []; 
    // Same, same; but different. 

    var a=[]; 
    for(var i=0;i<arr1.length;i++) 
     a[arr1[i]]=true; 

    for(var j=0;j<arr2.length;j++) 
     if(a[arr2[j]]) 
      delete a[arr2[j]]; 
     else 
      a[arr2[j]]=true; 

    for(var k in a) 
     newArr.push(k); 

    return newArr; 
} 
+3

C和C++都有等價的構造,您聲稱知道這些構造。 – Blindy

+0

@Bindy:在其他C,C++中,我們通常在'[]'中提供數組的索引。奇怪的是看到一個數組作爲另一個數組中的索引。 –

+0

他們是索引。我沒有感到困惑,你用'arr1 [i]'爲'a'編制索引,這與它們的等價C和C++結構完全相同。 – Blindy

回答

1

似乎a是布爾值的列表,從而使特定的分配集合a的指數來true之一。該索引通過取消引用arr1來計算。

在上面的註釋中,您表達了一種擔心,即數組被用作另一個數組內的索引。但是不需要擔心,因爲它不是數組本身(即arr1),它用作索引,而是該數組的一個元素(即對於某些i而言爲arr1[i])。

0

與高級語言相同的邏輯也適用於此處。

這可以很容易地澄清分裂這個小塊。

a[arr1[i]]=true; 

ARR1 - 整數

的陣列 - 布爾

0

數組你想知道有關語法a[arr1[i]]。很簡單:

  • arr1[i] value是數組a的索引。
  • 如果arr1[i]值是一個數字,以5爲例。所以它會是:a[5]=true。在這種情況下沒有什麼特別的。
  • 正如您在評論中所說的,arr1[i]例如可能是string"boy"。那麼,它將是:a["boy"]=true

您應該知道,JavaScript中的數組索引可能是一個字符串。但要小心,正如W3School所說,如果使用命名索引,JavaScript將重新定義數組爲標準對象。之後,所有數組方法和屬性將產生不正確的結果。例如:

var person = []; 
person["firstName"] = "John"; 
person["lastName"] = "Doe"; 
person["age"] = 46; 
var x = person.length;   // person.length will return 0 
var y = person[0];    // person[0] will return undefined 

更多細節,看看在W3School這個警告部分。

0

下面是用註釋解釋發生了什麼和樣本輸出

var arr1 = [1,2,'foo','bar']; 
var arr2 = [2,3,'foo']; 
var diff = diff(arr1, arr2); 

console.log(diff); // ["1", "3", "bar"] 

function diff(arr1, arr2) { 
    var newArr = []; 
    var a=[]; 

    // Loop through arr1 
    // set the value of each entry as an index in array `a` 
    // set the value of the entry in `a` to true 
    for(var i=0;i<arr1.length;i++) 
     a[arr1[i]]=true; 
    // console.log(a); // [1: true, 2: true, foo: true, bar: true] 

    // Loop through arr2 
    // check if each entry exists as an index in array `a` 
    // if it does, delete the value from array `a` 
    // if not, set the value of the entry in `a` to true 
    for(var j=0;j<arr2.length;j++) 
     if(a[arr2[j]]) 
      delete a[arr2[j]]; 
     else 
      a[arr2[j]]=true; 
    // console.log(a); // [1: true, 3: true, bar: true] 

    // put all of the indexs of array `a` to values in `newArr` 
    for(var k in a) 
     newArr.push(k); 

    return newArr; 
} 

http://jsfiddle.net/daCrosby/6rcf1j72/


從代碼清理的一面,如果你想有一個較短的功能,你可以使用類似一個代碼其中:

console.log("Looping", diffLoop); // [1, "bar", 3] 
console.log("Filtering", diffFilter); // [1, "bar", 3] 

function diffLoop(arr1, arr2){ 
    var arr = arr1; 

    for(var j=0; j<arr2.length; j++) 
     if(arr.indexOf(arr2[j]) > -1) 
      arr.splice(arr.indexOf(arr2[j]), 1); 
     else 
      arr.push(arr2[j]); 
    return arr; 
} 

function diffFilter(arr1, arr2){ 
    var arr = arr1.concat(arr2); 
    return arr.filter(function(i) { 
     var in1 = arr1.indexOf(i) < 0; 
     var in2 = arr2.indexOf(i) < 0; 
     return (in1 || in2) && !(in1 && in2); 
    }); 
} 

http://jsfiddle.net/daCrosby/6rcf1j72/1/

相關問題