如何在JS数组的所有元素之间插入一个新元素?

时间:2017-10-02 15:25:02

标签: javascript arrays

我有一个数组[a, b, c]。我希望能够在这个数组的每个元素之间插入一个值,如:[0, a, 0, b, 0, c, 0]

我想这会是这样的,但我不能让它发挥作用。

for (let i = 0; i < array.length; i++) {
    newArray = [
        ...array.splice(0, i),
        0,
        ...array.splice(i, array.length),
    ];
}

感谢您帮助我!

19 个答案:

答案 0 :(得分:15)

为了获得一个新数组,你可以连续部分为每个元素添加一个零元素。

var array = ['a', 'b', 'c'],
    result = array.reduce((r, a) => r.concat(a, 0), [0]);
    
console.log(result);

使用相同的数组

var array = ['a', 'b', 'c'],
    i = 0;

while (i <= array.length) {
    array.splice(i, 0, 0);
    i += 2;
}

console.log(array);

从最后开始迭代会有点短。

var array = ['a', 'b', 'c'],
    i = array.length;

do {
    array.splice(i, 0, 0);
} while (i--)

console.log(array);

答案 1 :(得分:4)

如果要排除数组的开头和结尾,另一种方法是:

&#13;
&#13;
var arr = ['a', 'b', 'c']
var newArr = [...arr].map((e, i) => i < arr.length - 1 ? [e, 0] : [e]).reduce((a, b) => a.concat(b))

console.log(newArr)
&#13;
&#13;
&#13;

答案 2 :(得分:4)

另一种方式:

&#13;
&#13;
var a = ['a', 'b', 'c'],
  b;

b = a.reduce((arr, b) => [...arr, b, 0], []);

console.log(b);
&#13;
&#13;
&#13;

答案 3 :(得分:2)

您可以将map()与ES6差异语法和concat()

一起使用

&#13;
&#13;
var arr = ['a', 'b', 'c']
var newArr = [0].concat(...arr.map(e => [e, 0]))

console.log(newArr)
&#13;
&#13;
&#13;

答案 4 :(得分:2)

您可以使用.reduce()

function intersperse(arr, val) {
  return arr.reduce((acc, next) => {
    acc.push(next);
    acc.push(val);
    return acc;
  }, [val]);
}

console.log(intersperse(['a', 'b', 'c'], 0));

或者通过修改原始数组来实现这一目的:

function intersperse(arr, val) {
  for (let i = 0; i <= arr.length; i += 2) {
    arr.splice(i, 0, val);
  }

  return arr;
}

console.log(intersperse(['a', 'b', 'c'], 0));

答案 5 :(得分:1)

您可以尝试以下代码。它将在数组的每个两个元素的中间加0

console.log(['a', 'b', 'c'].reduce((r, a) => r.concat(a,0), [0]).slice(1, -1))

答案 6 :(得分:0)

您只需循环遍历数组元素并在每次迭代中添加新元素,如果到达最后一次迭代,则在最后一项之后添加新元素。

这应该是你的代码:

var arr = ['a', 'b', 'c'];
var results = [];
arr.forEach(function(el, index) {
  results.push(addition);
  results.push(el);
  if (index === arr.length - 1)
        results.push(addition);
});

<强>演示:

这是一个演示片段:

&#13;
&#13;
var arr = ['a', 'b', 'c'];
var results = [];
var addition = 0;
arr.forEach(function(el, index) {
  results.push(addition);
  results.push(el);
  if(index === arr.length -1)
        results.push(addition);
});
console.log(results);
&#13;
&#13;
&#13;

答案 7 :(得分:0)

&#13;
&#13;
function insert(arr, elm) {
  var newArr = [];
  for(var i = 0; i < arr.length; i++) {   // for each element in the array arr
    newArr.push(elm);                     // add the new element to newArr
    newArr.push(arr[i]);                  // add the current element from arr
  }
  newArr.push(elm);                       // finally add the new element to the end of newArr
  return newArr;
}

console.log(insert(["a", "b", "c"], 0));
&#13;
&#13;
&#13;

答案 8 :(得分:0)

可以通过拆分和连接来完成字符串。

&#13;
&#13;
var arr = ['a', 'b', 'c'];
var newArray = ("0," + arr.toString().split(",").join(",0,")).split(",");
console.log(newArray);
&#13;
&#13;
&#13;

答案 9 :(得分:0)

这看起来像intersperse algorithm,但也对头部和尾部做了一些补充。所以我称之为extrasperse

&#13;
&#13;
var arr         = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    extrasperse = (x,a) => a.reduce((p,c,i) => (p[2*i+1] = c, p), Array(2*a.length+1).fill(x));

console.log(JSON.stringify(extrasperse("X",arr)));
&#13;
&#13;
&#13;

答案 10 :(得分:0)

你可以做到

let arr = ['a', 'b', 'c'];

arr = arr.reduce((a, b) => {
    a.push(0);
    a.push(b);
    return a;
}, []);
arr.push(0);
console.log(arr);

答案 11 :(得分:0)

let arr = ['a', 'b', 'c'];

function insert(items, separator) {
  const result = items.reduce(
    (res, el) => [...res, el, separator], [separator]);
  return result;
}

console.log(insert(arr, '0'));

答案 12 :(得分:0)

使用flatmap的另一个ES6 +版本(如果可以创建一个新数组):

['a', 'b', 'c', 'd']
    .flatMap((e, index) => index ? [e, 0] : [0, e, 0])

答案 13 :(得分:0)

以上所有方法都使用很长的字符串,导致我的Android计算机在React Native上运行时内存不足。 我明白了这一点

let arr = ['a', 'b', 'c'];
let tmpArr = [];

for (const item in arr) {
  tmpArr.push(item);
  tmpArr.push(0);
}

console.log(tmpArr);

答案 14 :(得分:0)

另一种方法是使用一些功能方法,例如zip和flat。检出lodash

const array = ['a', 'b', 'c']
const zeros = Array(array.length + 1).fill(0)
const result = _.zip(zeros, array).flat().filter(x => x !== undefined)
console.log(result)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

答案 15 :(得分:0)

如果您只想在现有元素之后插入元素:

console.log(["a", "b", "c"].map(i => [i, 0]).flat())

答案 16 :(得分:0)

仅在以下位置之间插入的直接方式

const arr = ['a', 'b', 'c'];

arr.map((v, i) => !i || i === arr.length - 1 ? [v] : [0, v]).flat() 

答案 17 :(得分:0)

我认为这是正确的,即只是在数组的元素之间添加元素,并且应该非常有效:

sample_data[1:2,] %>% 
  mutate(link_to_text=map_chr(link, 
                              possibly(fn_get_link_to_records,
                                       otherwise="missing")))
#> [1] "https://www.parlament.gv.at/PAKT/VHG/XXVII/NRSITZ/NRSITZ_00068/index.shtml#tab-Sten.Protokoll"
#> [1] "https://www.wrong-url.foobar"
#> # A tibble: 2 x 2
#>   link                                  link_to_text                            
#>   <chr>                                 <chr>                                   
#> 1 https://www.parlament.gv.at/PAKT/VHG~ https://www.parlament.gv.at//PAKT/VHG/X~
#> 2 https://www.wrong-url.foobar          missing
sample_data[3, ] %>% 
  mutate(link_to_text=map_chr(link, 
                              possibly(fn_get_link_to_records,
                                       otherwise="missing")))
#> [1] "https://www.parlament.gv.at/PAKT/VHG/XXVII/NRSITZ/NRSITZ_00094/index.shtml#tab-Sten.Protokoll"
#> Error: Problem with `mutate()` input `link_to_text`.
#> x Result 1 must be a single string, not a vector of class `glue/character` and of length 0
#> i Input `link_to_text` is `map_chr(link, possibly(fn_get_link_to_records, otherwise = "missing"))`.

答案 18 :(得分:0)

感谢您提出问题并感谢所有贡献者的回答。 这将是我的方法

const arr = ["a", "b", "c"];
let toAdd = 0;
for (let i = 0; i <= arr.length; i += 2) {
  arr.splice(i, 0, toAdd);
}
console.log(arr);

const arr = ["a", "b", "c"];
let toAdd = 0;
const newArr = [];
newArr.unshift(toAdd);
for (let i = 0; i < arr.length; i++) {
  newArr.push(arr[i]);
  newArr.push(toAdd);
}
console.log(newArr);

干杯 导航