Javascript的对象没有任何本机合并操作。如果你有两个对象,比如说
{a:1, b:2}
{c:3, d:4}
并且想要得到
{a:1, b:2, c:3, d:4}
据我所知,您必须遍历对象。也就是说,您决定使用merge left或merge right策略,然后执行以下操作(简化)
for (key in object2) {
object1[key] = object2[key];
}
这很好。但是,Javascript具有call
和prototype
功能。例如,可以使用以下命令将arguments
转换为Array
Array.prototype.slice.call(arguments)
这种方法利用了现有的本机代码,因此不容易受到程序员愚蠢行为的影响,并且应该比非本机实现运行得更快。
问题是
在DOM的Attribute
或Node
遍历特性上,或者在一些通用的String
函数上使用这种原型/调用模式,以便进行本机对象合并,有什么技巧吗?
代码将如下所示:
var merged = somethingrandom.obscuremethod.call(object1, object2)
因此,您可以在没有遍历的情况下获得本机合并。
一个可能的、次优的解决方案
如果您可以使用Object
的constructor
属性,然后强制一个对象具有另一个对象的构造函数,然后在复合对象上运行new
,则可以免费获得合并。但是我不能很好地理解javascript中constructor
特性的全部含义,无法做出这样的调用。
引理
同样的问题也适用于Arrays
。一个常见的问题是,假设有7个数字数组,然后尝试找出这些数组的交集。也就是说,哪些数字在所有7个数组中都存在。
您可以将它们连接在一起,然后进行排序,然后进行遍历。但如果有一个通用的交集隐藏在某个地方,我们可以强制一个数组在本地执行,那就太好了。
有什么想法吗?
编辑:
半途而废
对于数组问题,您可以执行以下操作:
array.concat(a,b,c).sort().join(':'),然后使用一些棘手的RegExp
捕获和重复模式来遍历。如果您不了解RegExp实现,可以在一个非常简单的基于堆栈的虚拟机上运行。当您初始化正则表达式时,这实际上是一个需要编译的程序(RegExp.compile是一个已弃用的JS方法)。然后,本机以极快的速度遍历字符串。也许你可以利用这一点作为会员阈值,并获得更好的性能……
尽管如此,它仍然没有走完所有的路。
https://stackoverflow.com/questions/4740806
复制相似问题