【问题标题】:How to insert a new element at any position of a JS array?如何在 JS 数组的任意位置插入新元素?
【发布时间】:2018-03-13 16:59:09
【问题描述】:

我有一个数组[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),
    ];
}

谢谢你帮助我!

【问题讨论】:

标签: javascript arrays


【解决方案1】:

为了获得一个新数组,您可以连接该部分并为每个元素添加一个零元素。

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);

【讨论】:

    【解决方案2】:

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

    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)

    【讨论】:

      【解决方案3】:

      您可以使用 map() 和 ES6 扩展语法和 concat()

      var arr = ['a', 'b', 'c']
      var newArr = [0].concat(...arr.map(e => [e, 0]))
      
      console.log(newArr)

      【讨论】:

        【解决方案4】:

        另一种方式:

        var a = ['a', 'b', 'c'],
          b;
        
        b = a.reduce((arr, b) => [...arr, b, 0], []);
        
        console.log(b);

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            你可以使用.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));

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

              • 我很好奇为什么你用0 初始化r 的值,只是稍后将其切掉?为什么不.reduce((r, a) =&gt; r.concat(a,0), []).slice(0, -1)
              【解决方案8】:

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

              这应该是你的代码:

              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);
              });
              

              演示:

              这是一个演示 sn-p:

              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);

              【讨论】:

                【解决方案9】:

                可以通过拆分和连接来使用字符串。

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

                【讨论】:

                  【解决方案10】:

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

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

                  【讨论】:

                    【解决方案11】:

                    你可以这样做

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

                    【讨论】:

                      【解决方案12】:

                      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】:

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

                        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)));

                        【讨论】:

                          【解决方案14】:

                          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'));

                          【讨论】:

                            【解决方案15】:

                            上述所有方法都在很长的字符串中使我在 React Native 上运行的 android 计算机内存不足。 我让它与这个一起工作

                            let arr = ['a', 'b', 'c'];
                            let tmpArr = [];
                            
                            for (const item in arr) {
                              tmpArr.push(item);
                              tmpArr.push(0);
                            }
                            
                            console.log(tmpArr);

                            【讨论】:

                            • 当问题只要求在每对元素之间插入零时,您的解决方案会在末尾添加一个额外的零
                            【解决方案16】:

                            另一种方法是使用一些函数式方法,例如 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)
                            &lt;script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"&gt;&lt;/script&gt;

                            【讨论】:

                              【解决方案17】:

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

                              const arr = ['a', 'b', 'c'];
                              
                              arr.map((v, i) => !i || i === arr.length - 1 ? [v] : [0, v]).flat() 
                              

                              【讨论】:

                                【解决方案18】:

                                我觉得这样说是对的,即只是在数组的元素之间添加元素,应该是相当高效的:

                                const intersperse = ([first, ...tail]: any[], element: any) => (
                                    (first === undefined) ? [] : [first].concat(...tail.map((e) => [element, e]))
                                );
                                
                                console.log(intersperse([], 0));
                                console.log(intersperse([1], 0));
                                console.log(intersperse([1, 2, 3], 0));

                                【讨论】:

                                  【解决方案19】:

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

                                  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);

                                  干杯 导航

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2016-11-03
                                    • 2017-09-25
                                    • 2022-01-12
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2011-12-12
                                    • 2011-09-11
                                    • 2011-03-22
                                    相关资源
                                    最近更新 更多