2017-02-24 69 views
0

我試圖在javascript中比較兩個列表。如果ListA中存在不在ListB中的東西 - 我想將它推到ListB。如果它存在,我不想做任何事情。列表中的項目是字符串。測試兩個字符串是否相等給出奇數結果

當我檢查一個字符串是否等於另一個字符串時,我得到了非常奇怪的結果。這裏是我的JS:

function assignColor() { 
    var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"] 
    var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"]; 
    length_of_existing = list_existing.length; 

    i=0; 
    while (i < test.length) { 
     var person_in_list = test[i] 

     for (var j=0; j <= parseInt(length_of_existing); j++) { 

      if (person_in_list === list_existing[j]) { 
       console.log("equal"); 
      } 
      else { 
       console.log("not equal"); 
       list_existing.push(person_in_list); 
      } 
     } 
    ++i; 
    } 
    console.log(list_existing); 
} 

我得到list_existing的輸出如下:

[ 「JackBean」, 「MRX」, 「超人」, 「BobHemsworth」, 「JackBean」,「 JackBean「,」MrX「,」SuperMan「,」BobHemsworth「]

這可能是令人沮喪的簡單。但我嘗試了幾種不同的組合來成功比較兩個字符串....失敗。

回答

1

使用Set可以非常容易地實現這個功能,它根據定義保存唯一值 - 因此您只需concat()這兩個數組,然後創建一個新的Set並獲得結果:

var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"] 
 
var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"]; 
 

 
let set = new Set(list_existing.concat(test)); 
 
let result = [...set]; 
 
console.log(result);

+0

這個作品真的很好謝謝! –

+0

不客氣! @RuthYoung – baao

0

約做這樣的事情是什麼?

function assignColor() { 
    var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"] 
    var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"]; 


    test.forEach(item => { 
     if(!~list_existing.indexOf(item)){ 
      list_existing.push(item); 
     } 
    }); 
    console.log(list_existing); 
} 

assignColor(); 

只是循環的第一陣列,並檢查是否有一個簡單的「的indexOf」 :)

EDIT第二陣列中存在項目:baao有一個更好的解決方案

0

這將是簡單得多:

var test = ['a', 'b', 'c']; 
var list_existing = ['b', 'd']; 

test.forEach(function(el) { 
    if (list_existing.indexOf(el) === -1) { 
     list_existing.push(el); 
    } 
}); 
1

您的問題存在於你的if/else條件

Basiclly,當你發現相等時,你不應該繼續迭代你的list_existing你應該停止並繼續while循環。

所以我的想法是修改for (var j=0; j <= parseInt(length_of_existing); j++)

for (var j=0; j <= parseInt(length_of_existing) && notFound; j++) 

和NOTFOUND在真正的初始化,當平等被發現爲假。

1

好的,你正在做的是檢查每個元素對每一個其他元素。這意味着,當傑克與傑克比較時,什麼也沒有發生,但是你把傑克與麥克斯比較,它認爲傑克需要被添加。

通過查看整個數組而不是單個元素來解決此問題。

function assignColor() { 
    var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"] 
    var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"]; 
    length_of_existing = list_existing.length; 

    i=0; 
    while (i < test.length) { 
     var person_in_list = test[i] 

     if (list_existing.indexOf(test[i]) === -1) { //not found 
      list_existing.push(test[i]); //add the missing element 
     } 
    ++i; 
    } 
    console.log(list_existing); 
} 

JSFiddle

array.indexOf查看是否值已經存在,如果它返回索引。您需要小心,因爲您可以將0作爲有效結果(數組中的索引0是您所知的第一個)。 array.indexOf通過使用-1作爲false /未找到解決此問題。這就是爲什麼我必須在if語句中指定而不是僅僅對結果進行布爾化。

1

問題出在你的for循環定義的第二條語句上:它說j <= parseInt(length_of_existing)但它應該說j < parseInt(length_of_existing),因爲如果你使用< =,循環會運行一個額外的時間。在那段時間內,當前索引(4)中的元素將是未定義的,因此,下面的if語句將評估爲false。

0

你可以做到這一點伊斯利包括功能

function assignColor() 
{ 

var a = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"]; 
var b = ["JackBean", "MrX", "SuperMan", "BobHemsworth"]; 

      for(var j=0; j < a.length; j++) { 

      if(b.includes(a[j])) alert("contain") 

      else b.push(a[j]); 

    } 
console.log(b) 
}