开发者问题收集

Javascript 组合数组或字符串

2010-10-26
1019

我有以下动态生成的字符串:

var stringA = ["a1", "a2", "a3" ... 'a400' ... 'a600']; // length 600
var stringB = ["b1", "b2", "b3" ... 'b400']; // length 400

如何获取像这样组合的数组或字符串:

var myString = ["a1b1", "a2b2", "a3b3" ... "a400b400", "a401" ... "a600"]
3个回答

您可以这样做:

var result = [], len = Math.max(stringA.length, stringB.length);
for(var i=0; i < len; i++) {
    result.push((stringA[i] || "") + (stringB[i] || ""));
}

您可以在此处测试 || "" 是为了防止在较短的数组上将 undefined 作为字符串获取。 Math.max() 调用是为了允许 A 或 B 更长,它将迭代到任一者的末尾,就像问题中的 A 更长一样。

Nick Craver
2010-10-26

我不认为 Array 对象中内置了可以为您完成此操作的任何东西,您必须执行循环。但是,循环很简单:

var index, length;
var result = [];
// assertion: arrayA.length === arrayB.length
result.length = arrayA.length; // Helps performance in some implemenations, harmless in others
for (index = 0, length = arrayA.length; index < length; ++index) {
     result[index] = arrayA[index] + arrayB[index];
}

(我已重命名 stringA -> arrayAstringB -> arrayB 以避免混淆。)

如果数组的长度不同 数组中的某些条目未定义(这是完全可能的,JavaScript 数组是稀疏的),您需要在循环中处理它,例如:

var index, length, Apresent, Bpresent;
var result = [];
result.length = Math.max(arrayA.length, arrayB.length); // Helps performance in some implementations, harmless in others
for (index = 0, length = result.length; index < length; ++index) {
     Apresent = arrayA.hasOwnProperty(index);
     Bpresent = arrayB.hasOwnProperty(index);
     if (Apresent && Bpresent) {
         result[index] = arrayA[index] + arrayB[index];
     }
     else if (Apresent) {
         result[index] = arrayA[index];
     }
     else if (Bpresent) {
         result[index] = arrayB[index];
     }
}

如果数组是稀疏的,并且它们恰好在同一索引处是稀疏的,则生成的数组也将是稀疏的。

T.J. Crowder
2010-10-26

如果您不需要保留原始 2 个数组中的项目,那么下面的代码效果非常好。它对 for 循环中的迭代次数没有预先确定的限制,这意味着 stringAStringB 数组的大小可能会在代码运行时继续增长。

var myString = [];
for(var answer; answer = (stringA.shift() || "") + (stringB.shift() || "");) {
    myString.push(answer);
}
Eric
2010-10-26