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具有call和prototype功能.例如,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方法).然后本机以极快的速度在字符串上运行.也许你可以利用它来获得会员门槛并获得更好的表现......
尽管如此,它仍然没有完全消失.
我希望这可以工作,但它没有:
#include <stdio.h>
typedef struct closure_s {
void (*incrementer) ();
void (*emitter) ();
} closure;
closure emit(int in) {
void incrementer() {
in++;
}
void emitter() {
printf("%d\n", in);
}
return (closure) {
incrementer,
emitter
};
}
main() {
closure test[] = {
emit(10),
emit(20)
};
test[0] . incrementer();
test[1] . incrementer();
test[0] . emitter();
test[1] . emitter();
}
Run Code Online (Sandbox Code Playgroud)
它实际上并编译和1个实例不工作...但第二个失败.知道如何在C中获得闭包吗?
真的很棒!
由于(html5)localStorage及其等价物在标签和窗口之间存在,我已经考虑过将它用于消息传递.问题是fetch和store是不同的操作,因此不是原子操作.我的模型依赖于UUID生成,冲突解决和信标来完成我需要做的小部分,但我真正的问题是:
由于本地存储是共享内存资源,因此可用于相互访问的锁定机制是什么?
这与一系列面向对象的C贴片有关,但不同之处在于我不想要所有的功能,只有一个:
能够做到这一点:
struct foo {
int (*bar)(void);
char baz;
};
Run Code Online (Sandbox Code Playgroud)
然后有一个反向引用.C有一个名为cdecl的调用约定; 基本上将参数推送到堆栈,有一个返回指针,然后跳转到某个地址.该地址的代码从堆栈中弹出参数并继续它的快乐方式.
thiscall约定略有不同,因为它隐式地添加了一个额外的参数,一个"this"指针.
既然你可以开始用C执行任意字节码很容易,因为GCC支持内嵌汇编模板,这听起来像你可能只是做一些宏,以便你可以喜欢做一些事情:
int bar(void) {
GETTHIS;
cThis->baz = 0;
}
int createFoo(struct Foo*pFoo) {
ASSIGN(pFoo, bar);
}
Run Code Online (Sandbox Code Playgroud)
基本上什么ASSIGN会做的是在好歹台阶CDECL来模拟thiscall风格公约,那么什么获得OS 3.0会做的是会计把戏的另一边.
我想知道是否:
只有这一点; 真正的"我们所有人都同意成年人"风格的会员功能,简直太棒了.谢谢!
笔记:
我的Google-fu在这里让我失望.
如果我有一个"hello world"的标记,然后将它用作bash的内置读取的stdin,我将截断尾随空格.有没有办法保留它?