2017-04-18 70 views
-5

我有一個數組,它看起來像如何在數組中比較字符串:使用Javascript

var arr = ["a|c", "a|e", "x|z"]; 
for(var x in arr){ 
    var appsplit = x.split("|"); 
} 

如果第一個值(例如:1)中的元素匹配,那麼就應該結合值

Ex: output ace xz

請指教如何做到這一點。

+1

你的問題是什麼?你有嘗試過什麼嗎?這是在JavaScript還是Java? – tnw

+0

java!= javascript – epascarello

+0

@tnw OP顯然嘗試過'javascript'問題? – guest271314

回答

1

你正在測試每個人的閱讀理解與謎語。

var pairs = {}; 

var arr = ["a|c", "a|e", "x|z"]; 
for(var x in arr) 
{ 
    var appsplit = arr[x].split("|"); 
    if(pairs[appsplit[0]] !== "undefined") 
    { 
     pairs[appsplit[0]] = pairs[appsplit[0]] + appsplit[1]; 
    } 
    else 
    { 
     pairs[appsplit[0]] = appsplit[1]; 
    } 

} 

var matches = []; 

for(var x in pairs) 
{ 
    matches.push(x + pairs[x]); 
} 

console.log(matches); 

我們需要繪製出這個對象調用pairsarr元素。在分裂的第一個值將是關鍵,第二個值被附加(或分配if這是第一場比賽的關鍵)

你讓分裂x的錯誤,但你只分裂元素的索引,而不是元素的實際值。 arr[x]是實際值,其中x指定數組中的索引。

當我們通過您的arr後,我們現在可以將鍵與值合併。您的輸出包含在matches中,其中每對中的密鑰都預置爲密鑰對的值。

+0

太棒了。 + 100 – Gautam

+1

注意:這種方法的一個缺點(這就是爲什麼我在解決方案中使用數組的原因)是對象結構不能保證它的內容的順序,所以當你做'for(var x in pairs)',這些字符串可能會或可能不會按照它們創建的順序出現。但是,如果訂單不重要,那麼這將工作正常。 – talemyn

+1

@talemyn嚴格來說,這是事實。但[這篇文章](http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop)解釋說,大多數現代瀏覽器遵循秩序。我自己體驗過的唯一例外情況(在Chrome中)是當你有一個只包含數字的「鍵」時。嘗試在您的Chrome開發者控制檯中粘貼「{」first「:1,」1one「:2,」2「:3}',然後觀察它是否先迭代」2「鍵。 – Vic

1

一些簡單的代碼,可以在這裏把戲。

var arr = ["a|c", "a|e", "x|z", "c|b", "z|e", "c|a"]; 
var resultObj = {}; 
arr.forEach(function(element, index){ 
    var array = element.split('|'); 
    if(array.length!==2){ 
     console.log("skipping, invalid input data", element); 
    } else { 
     var firstLetter = array[0]; 
     var secondLetter = array[1]; 
     if(resultObj[firstLetter]){ 
      resultObj[firstLetter].push(secondLetter); 
     } else { 
      resultObj[firstLetter]=[secondLetter]; 
     } 
    } 

}); 

Object.keys(resultObj).forEach(function(key){ 
    console.log(key + "," + resultObj[key]); 
}); 
1

您可以使用.reduce()Set不累加重複值,.some()檢查以前的數組包含當前的數組中值,.map()Array.from().join()到數組轉換爲字符串

var arr = ["a|c", "a|e", "x|z"]; 
 
var res = arr.reduce(function(a, b) { 
 
    var curr = b.split("|"); 
 
    var set = new Set; 
 
    for (let prop of curr) set.add(prop); 
 
    if (!a.length) { 
 
    a.push(set) 
 
    } else { 
 
    for (prop of a) { 
 
     if (curr.some(function(el) { 
 
      return prop.has(el) 
 
     })) { 
 
     for (el of curr) { 
 
      prop.add(el) 
 
     } 
 
     } else { 
 
     for (let prop of curr) set.add(prop); 
 
     a.push(set) 
 
     } 
 
    } 
 
    } 
 
    return a 
 
}, []).map(function(m) { 
 
    return Array.from([...m], function(el) { 
 
    return el 
 
    }).join("") 
 
}); 
 

 
console.log(res);

1

我覺得這可以做得更優雅,但我沒有時間精簡它。 :)下面的代碼會做你想要什麼,但:

var aStartArray = **ARRAY_VALUE_HERE**; 
var aSplitResultStrings = []; 

// step through each element in the array 
for (var i = 0, iSALength = aStartArray.length; i < iSALength; i++) { 

    // split the values for the current array element 
    var aSplitVal = aStartArray[i].split("|"); 
    var bStringDoesNotExist = true; 

    // loop through the "result strings" array 
    for (var j = 0, iSRSLength = aSplitResultStrings.length; j < iSRSLength; j++) { 

     // if the first letter from the array element = the first letter of the current "result string" . . . 
     if (aSplitResultStrings[j].charAt(0) === aSplitVal[0]) { 

      // append the second letter of the array value to the current result string 
      aSplitResultStrings[j] = aSplitResultStrings[j] + aSplitVal[1]; 

      // indicate that a match has been found and exit the "result string" loop 
      bStringDoesNotExist = false; 
      break; 
     } 
    } 

    // if there are no result strings that start with the first letter of the array value . . . 
    if (bStringDoesNotExist) { 

     // concatenate the two values in the current array value and add them as a new "result string" 
     aSplitResultStrings.push(aSplitVal[0] + aSplitVal[1]); 
    } 
} 

使用這些陣列,其結果是:

aStartArray = ["a|c", "a|e", "x|z"] //results in: 
aSplitResultStrings = ["ace", "xz"] 

aStartArray = ["a|b", "a|c", "a|d", "a|e", "x|y", "x|z"] //results in: 
aSplitResultStrings = ["abcde", "xyz"] 

aStartArray = ["a|b", "d|e", "d|f", "x|y", "g|h", "g|i", "m|n", "g|j", "a|c", "x|z"] //results in: 
aSplitResultStrings = ["abc", "def", "xyz", "ghij", "mn"] 

正如我所說的,這可能是更優雅(例如,你可以可能使用Map來更容易地遍歷「結果字符串」),但這會使步驟變得非常清晰,並且應該讓您沿着正確的路徑走向最終的解決方案。