我如何 return 使用来自不同数组的多个索引拼接数组

how do i return a spliced array using multiple indexes from a different array

dft=["t", "h", "i", "s", "I", "s", "S", "p", "i", "n", "a", "l", "T", "a", "p"];
ans=[4, 6, 12, -1];  
for(x=0;x<ans-1;x++){
dft.splice(ans[x],0,"-");}
return dft;

我正在尝试 return 使用 ans 数组中的索引(-1 索引除外)将具有“-”的数组放入 dft 数组。

我得到的结果是 ["t"、"h"、"i"、"s"、"I"、"s"、"S", "p", "i", "n", "a", "l", "T", "a", "p"]

this is the codepen i am working on

首先,它没有做任何事情,因为你的 for 循环结束条件应该根据 ans 数组的 length 检查循环参数 x,即 x < ans.length -1。其次,由于 splice 正在更改数组,因此在插入第一个连字符后,您的 ans 索引将不正确,因此您应该按相反的顺序进行操作,如下所示:

dft = ["t", "h", "i", "s", "I", "s", "S", "p", "i", "n", "a", "l", "T", "a", "p"];
ans = [4, 6, 12, -1];

for (x = ans.length - 2; x >= 0; x--) {
    dft.splice(ans[x], 0, "-");
}

console.log(dft);

我们从数组的末尾开始,也就是 ans.length - 1,除非您想跳过最后一个元素,所以我们从 ans.length - 2 开始。请记住,这假设最后一个元素应该被忽略

您可以通过 Array#reduce 达到您想要的结果。

let dft = ["t", "h", "i", "s", "I", "s", "S", "p", "i", "n", "a", "l", "T", "a", "p"];
let ans = [4, 6, 12, -1];
let res = dft.reduce((s,a,i) => {
  (ans.indexOf(i) > -1) ? s.push(a, '-') : s.push(a);
  return s;
}, []);

console.log(res);

您需要对索引数组进行排序,并按相反的顺序进行,否则会更改其他元素的索引。

var dft = ["t", "h", "i", "s", "I", "s", "S", "p", "i", "n", "a", "l", "T", "a", "p"],
  ans = [4, 6, 12, -1];

// sor the array to place - at the last higher index first
ans.sort(function(a, b) {
  return a - b;
});
// get array length
var x = ans.length;
// iterate upto index reach to 0 or reaching to -1
while (x-- && ans[x] > -1) {
  dft.splice(ans[x], 0, "-");
}

console.log(dft);

数组没有原始数字,因此您希望 for 循环条件读取 x < ans.length.

您的索引也需要是 ans[x] + x,因为每个 splice() 都会将数组的长度增加 1。

仅这些更改就可以实现您的既定目标。不过我还要补充:

  • 您应该有目的地声明变量,而不是使用隐式全局变量。

  • 你可以用forEach()方法代替你的for循环,这样可以让你的意图更明确。

  • 您可能希望术语和运算符之间有空格,这也有助于提高可读性。

为了完整起见,Array#reduceRight

的解决方案

var array = ["t", "h", "i", "s", "I", "s", "S", "p", "i", "n", "a", "l", "T", "a", "p"],
    indices = [4, 6, 12, -1],
    result = indices.reduceRight((r, i) => (~i && r.splice(i, 0, '-'), r), array);

console.log(result.join(''));