【问题标题】:how to do a "flat push" in javascript?如何在 javascript 中进行“平推”?
【发布时间】:2011-04-29 19:05:02
【问题描述】:

我想将源数组的所有单个元素推送到目标数组,

target.push(source);

仅将源的引用放在目标列表中。

相反,我想做:

for (i = 0; i < source.length; i++) {
    target.push(source[i]);
}

在 javascript 中有没有一种方法可以更优雅地做到这一点,而无需显式编码重复循环?

当我在这里时,正确的术语是什么?我不认为“平推”是正确的。谷歌搜索没有产生任何结果,因为源和目标都是数组。

【问题讨论】:

  • 所以你想让它表现得像 Perl? Perl 的论点扁平化通常很痛苦,但有时非常方便。是的,至少在 Perl 中它确实被称为“扁平化”

标签: javascript arrays push flatten


【解决方案1】:

apply 做你想做的事:

var target = [1,2];
var source = [3,4,5];

target.push.apply(target, source);

alert(target); // 1, 2, 3, 4, 5

MDC - 应用

使用给定的 this 调用函数 值和参数作为 数组

【讨论】:

  • +1 在必须保留对原始数组的引用的情况下,这是最好的解决方案。然后,您可以创建一个扩展数组原型的方法,如下所示: Array.prototype.pushAll = function (items) { Array.prototype.push.apply(this, items); };
  • 你能解释一下它比concat更好吗,concat还保留参考。
  • 当您阅读javascript中concat方法的描述时:“此方法不会更改现有数组,而是返回一个新数组,其中包含连接数组的值。”他们说:“一个新的数组正在返回......”在这种情况下,如果你尝试修改一个 api 的数组,在我的例子中,JQuery 表单插件在 beforeSubmit 事件中添加新项目,如果你使用 concat,你会创建一个新数组,如果您尝试用新数组替换现有数组,API 将不会收到有关此更改的通知。
  • 为了更深入的解释:这里有一点代码(对不起格式化):var arr = []; arr.push({ name: 'samuel' });添加(arr,“约翰”);控制台.log(arr.length);函数 add(arr, newItem){ var newArr = []; newArr.push({ name: newItem }); arr = arr.concat(newArr);在这种情况下,galambalazs 的解决方案将产生 2 的长度,而 concat 将产生 1。
【解决方案2】:

您可以使用concat 方法:

var num1 = [1, 2, 3];  
var num2 = [4, 5, 6];  
var num3 = [7, 8, 9];  

// creates array [1, 2, 3, 4, 5, 6, 7, 8, 9]; num1, num2, num3 are unchanged  
var nums = num1.concat(num2, num3);

【讨论】:

  • 这不符合 OP 的要求。 OP 想就地修改数组。
【解决方案3】:

执行此操作的更简单方法。

   var arr1 = [1,2,3] 
   var arr2 = [4,5,6] 
   arr1.push(...arr2) //arr1 now contains [1,2,3,4,5,6]

【讨论】:

    【解决方案4】:

    你可以简单地使用spread syntax:

    var arr1 = [0, 1, 2];
    var arr2 = [3, 4, 5];
    
    arr1 = [...arr1, ...arr2];
        // [0, 1, 2, 3, 4, 5]
    

    或者:

    var arr1 = ['a', 'b', 'c'];
    var arr2 = [1, 2, 3, ...arr1];
            // [1, 2, 3, 'a', 'b', 'c']
    

    演示:

    var arr1 = [0, 1, 2];
    var arr2 = [3, 4, 5];
    
    arr1 = [...arr1, ...arr2];
    console.log(arr1);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多