concat,但prepend而不是append

时间:2017-07-17 03:11:06

标签: javascript node.js concat

我遇到这种情况:

const args = ['b','c','d'];
var foo = 'a';
args.unshift(foo);
fn.apply(ctx, args); // args => ['a','b','c','d'] ✅

我可以使用concat,但这会将foo放在列表的末尾:

const args = ['b','c','d'];
var foo = 'a';
fn.apply(ctx, args.concat(foo)); // args => ['b','c','d','a'] ❌

我正在寻找" precat",这样我就可以在前面创建一个带有新元素的新数组,用JS做这个的最好方法是什么?我愿意为我节省一些代码:)

2 个答案:

答案 0 :(得分:1)

想到两个单线......

fn.apply(ctx, [foo].concat(args))

fn.call(ctx, foo, ...args)

后者使用ES2015 spread syntax

更新

不,没有Array#precat(),并且有充分的理由,因为这被证明是非常微不足道的。

TC39/proposal-array-precat(我在开玩笑!(也许......(它 意味着一个笑话)))

Object.defineProperty(Array.prototype, 'precat', {
  configurable: true,
  writable: true,
  value: function precat() {
    return Array.prototype.concat.call([], ...arguments, this)
  }
})

console.log(['e', 'f', 'g'].precat('a', ['b', 'c'], 'd'))

答案 1 :(得分:1)

您可以创建一个函数,该函数返回一个新的Array(),其中第一个变量在结果数组的索引0处传递,使用spread元素将第二个参数传递的数组连接到单个数组,或者如果不是参数在第二个参数传递,返回Array(),其元素在第一个参数

传递
const prepend = (element, array = []) => 
                  !element ? [] : Array.of(element, ...array);

prepend("a", ["b", "c", "d"]) // `["a", "b", "c", "d"]`

prepend("a") // `["a"]`

prepend() // `[]`