连接,但前置而不是附加[重复]

Posted

技术标签:

【中文标题】连接,但前置而不是附加[重复]【英文标题】:concat, but prepend instead of append [duplicate] 【发布时间】:2017-07-17 03:11:06 【问题描述】:

我有这种情况:

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 做这件事的最好方法是什么?我愿意接受任何可以节省我一行代码的事情:)

【问题讨论】:

args.unshift(foo); 的问题本身是否包含您的问题的答案? fn.apply(ctx, [foo].concat(args))fn.call(ctx, foo, ...args) @PatrickRoberts 当然,这些很好,请添加答案 第一条评论建议.unshift(),所以... @AntonioVal spread is not an operator What is SpreadElement in ECMAScript documentation? Is it the same as Spread operator at MDN?, Is …foo an operator or syntax? 【参考方案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'))

【讨论】:

对,但我特别想知道 precat 功能是否存在,有时这些东西确实存在,只是很难搜索到。 哈,伙计,concat 也很简单,考虑到你写的东西,那为什么 concat 会存在呢?抱歉,这没有意义:) precat 应该存在,它只是不存在。 @AlexanderMills " 是的,但我特别想知道 precat 功能是否存在" 是的,.unshift(),如 OP 所示 “并且有充分的理由,因为这被证明是非常微不足道的” - 如果这是在语言中包含内容的门槛,我认为其他一些方法可能已经省略。 @AlexanderMills 如果你真的想要的话,这里有你的 prollyfill。不过我相信你知道该怎么做。【参考方案2】:

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

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

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

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

prepend() // `[]`

【讨论】:

错误:在空数组前添加一个正整数。使用Array.of() @PatrickRoberts 是的,考虑Array.of(),是为这种情况创建的。另外不传参数的情况不应该返回[undefined],而是[],见更新帖 你为什么用Array()而不是[] @nnnnnn 是描述性的。 [] 致电Array();它们是同义词,是吗? @PatrickRoberts 需要使用 .concat() 的扩展元素,以便将第二个参数和第一个参数合并到同一数组 prepend("a", ["c", "d"]) // ["a", Array(2)]

以上是关于连接,但前置而不是附加[重复]的主要内容,如果未能解决你的问题,请参考以下文章

性能(JAVA)~ 循环中的字符串连接,带有前置和附加

log4j:警告找不到记录器的附加程序(运行 jar 文件,而不是 Web 应用程序)[重复]

Jquery追加/前置svg并查找子元素

如何在 Scala mutable.Seq 上附加或前置

List.append() 将所有元素更改为附加项[重复]

Angular 4,热模块替换附加而不是替换