JavaScript 中同一个元素多次进行 Push/Shift 操作

9
我有以下代码:
var foo = 'foo'
var bar = 'bar'
var arr = [1,2,3]

我想在数组开头添加多个foo,并在数组末尾添加bar。每个元素添加的次数应该是动态的,并且结果数组应该类似于:['foo','foo',1,2,3,'bar','bar','bar']。是否有比为每个元素使用循环更好的方法?如果需要,可以使用lodash。

2
简单的回答,不行。 - Baruch
5个回答

16

如果“更好”意味着“更短”,那么有一种方法:

 var foo = 'foo';
 var bar = 'bar' 
 var arr = [1,2,3]

 var result = [
   ...Array(2).fill(foo),
   ...arr,
   ...Array(3).fill(bar)
];

我喜欢这个解决方案 (+1) 但是请注意 - 不支持 IE < 12 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/fill - Rahul Desai

2
或者类似于这样的东西。

var foo = Array.from({length:2}, v => 'foo');
var bar = Array.from({length:3}, v => 'bar');
var arr = [1,2,3]

arr.push(...bar);
arr.unshift(...foo);
console.log(arr);


1
尝试使用这个 forloop 方法。Array#unshift() 在数组开头添加值。push 在数组末尾添加。

var foo = 'foo'
var bar = 'bar'
var arr = [1,2,3]

for(var i=0; i<(Math.random() * 5); i++){
arr.unshift(foo)
}
for(var i=0; i<(Math.random() * 5); i++){
arr.push(bar)
}
console.log(arr)


0

你可以像这样使用 unshiftpush

function pushToBeginning(arr, str, count){
    while(count--){
        arr.unshift(str);
    }
}

function pushToEnd(arr, str, count){
    while(count--){
        arr.push(str);
    }
}

let arr = [1, 2, 3];

pushToBeginning(arr, 'Foo', 3);
pushToEnd(arr, 'Bar', 2);

console.log(arr);


0

这里大多数答案都使用展开语法或for循环进行推送。但是建议使用Array.concat()来获得更好的性能并避免堆栈溢出错误

var foo = 'foo';
var bar = 'bar'
var arr = [1, 2, 3]

var result = arr.concat(Array(2).fill(foo), Array(3).fill(bar));
console.log(result)

请注意 - 根据此答案,仅建议对原始数据类型使用Array.fill
对于非原始类型,您需要使用Array.from,因为这样数组中的所有元素将引用内存中的同一对象,因此对数组中一个项目的突变会影响数组中的每个项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接