我有一個數組,它看起來像如何在數組中比較字符串:使用Javascript
var arr = ["a|c", "a|e", "x|z"];
for(var x in arr){
var appsplit = x.split("|");
}
如果第一個值(例如:1)中的元素匹配,那麼就應該結合值
Ex: output ace xz
請指教如何做到這一點。
我有一個數組,它看起來像如何在數組中比較字符串:使用Javascript
var arr = ["a|c", "a|e", "x|z"];
for(var x in arr){
var appsplit = x.split("|");
}
如果第一個值(例如:1)中的元素匹配,那麼就應該結合值
Ex: output ace xz
請指教如何做到這一點。
你正在測試每個人的閱讀理解與謎語。
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);
我們需要繪製出這個對象調用pairs
的arr
元素。在分裂的第一個值將是關鍵,第二個值被附加(或分配if
這是第一場比賽的關鍵)
你讓分裂x
的錯誤,但你只分裂元素的索引,而不是元素的實際值。 arr[x]
是實際值,其中x
指定數組中的索引。
當我們通過您的arr
後,我們現在可以將鍵與值合併。您的輸出包含在matches
中,其中每對中的密鑰都預置爲密鑰對的值。
太棒了。 + 100 – Gautam
注意:這種方法的一個缺點(這就是爲什麼我在解決方案中使用數組的原因)是對象結構不能保證它的內容的順序,所以當你做'for(var x in pairs)',這些字符串可能會或可能不會按照它們創建的順序出現。但是,如果訂單不重要,那麼這將工作正常。 – talemyn
@talemyn嚴格來說,這是事實。但[這篇文章](http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop)解釋說,大多數現代瀏覽器遵循秩序。我自己體驗過的唯一例外情況(在Chrome中)是當你有一個只包含數字的「鍵」時。嘗試在您的Chrome開發者控制檯中粘貼「{」first「:1,」1one「:2,」2「:3}',然後觀察它是否先迭代」2「鍵。 – Vic
一些簡單的代碼,可以在這裏把戲。
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]);
});
您可以使用.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);
我覺得這可以做得更優雅,但我沒有時間精簡它。 :)下面的代碼會做你想要什麼,但:
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
來更容易地遍歷「結果字符串」),但這會使步驟變得非常清晰,並且應該讓您沿着正確的路徑走向最終的解決方案。
你的問題是什麼?你有嘗試過什麼嗎?這是在JavaScript還是Java? – tnw
java!= javascript – epascarello
@tnw OP顯然嘗試過'javascript'問題? – guest271314