在Javascript中合并对象的本机方式

kri*_*ous 47 javascript optimization prototype

Javascript的Object没有任何本机合并操作.如果你有两个对象,比如说

{a:1, b:2}
{c:3, d:4}
Run Code Online (Sandbox Code Playgroud)

并希望得到

{a:1, b:2, c:3, d:4}
Run Code Online (Sandbox Code Playgroud)

据我所知,你必须遍历对象.也就是说,您决定合并左侧或合并右侧策略,然后您执行类似(简化)的操作

for (key in object2) {
  object1[key] = object2[key];
}
Run Code Online (Sandbox Code Playgroud)

这可以.但是,Javascript具有callprototype功能.例如,arguments变成一个Array可以完成

Array.prototype.slice.call(arguments)

这种方法利用现有的本机代码,因此不易受程序员的愚蠢影响,并且应该比非本机实现运行得更快.

这个问题

是否有一个技巧可以使用这个原型/调用模式Attribute或者NodeDOM的遍历功能,或者可能是一些通用String函数来进行本机对象合并?

代码看起来像这样:

var merged = somethingrandom.obscuremethod.call(object1, object2)

结果,您将获得原生合并而无需遍历.

一种可能的次优解决方案

如果您可以使用constructoran 的属性Object然后强制一个对象拥有另一个对象的构造函数然后new在复合对象上运行,则可以免费获得合并.但我没有牢牢掌握constructorjavascript 中该功能的全部含义来进行此调用.

引理

同样的问题也适用于此Arrays.一个常见的问题是采用7个数组,然后尝试找出这些数组的交集.也就是说,所有7个数组中都存在哪些数字.

您可以将它们连接在一起,然后进行排序,然后进行遍历,当然.但是如果有一个通用的交叉隐藏在某个地方我们可以强制一个数组进行本地化,这将是很好的.

有什么想法吗?

编辑:

走到一半

对于阵列问题,您可以执行以下操作:

array.concat(a,b,c).sort().join(':')然后使用一些棘手的RegExp捕获和重复模式来遍历.如果您不知道,RegExp实现在一个非常简单的基于堆栈的虚拟机上运行.初始化正则表达式时,它实际上是一个被编译的程序(RegExp.compile是一个不推荐使用的JS方法).然后本机以极快的速度在字符串上运行.也许你可以利用它来获得会员门槛并获得更好的表现......

尽管如此,它仍然没有完全消失.

Jak*_*kob 24

我对此的回答将令人失望,但仍然是:

没有

原因很简单:Resig先生在jQuery中实现合并(或"扩展",因为它被称为对象)正在做一个循环,就像你问题中的那个.你可以看一下它在这里.而且我敢说,如果John Resig没有找到一个聪明的内置方法来做到这一点,那么stackoverflow的凡人也不会:)

  • 我今天刚刚发表主题评论.:o)仅供参考,您可以点击github上的行号来创建该行的直接URL.按住Shift键并单击以突出显示范围. (6认同)

小智 9

使用 ES6 (ES2015),您可以使用Object.assign方法:

var x = {a:1, b:2};
var y = {c:3, d:4};
var z = Object.assign({},x,y);
Run Code Online (Sandbox Code Playgroud)

使用 ES7(ES2016、Chrome 60+ 或 Babel),您可以使用对象扩展运算符

var x = {a:1, b:2};
var y = {c:3, d:4}; 
var z = {...x, ...y};
Run Code Online (Sandbox Code Playgroud)