通常我会使用浅拷贝对象 angular.extend()
这是一个例子:
var object1 = {
"key": "abc123def456",
"message": {
"subject": "Has a Question",
"from": "example1@example.com",
"to": "example2@example.com"
}
};
var object2 = {
"key": "00700916391"
};
console.log(angular.extend({}, object1, object2));
将给我们:
{
"key": "00700916391",
"message": {
"subject": "Has a Question",
"from": "example1@example.com",
"to": "example2@example.com"
}
}
但是,如果我想合并对象以使父键不会被子对象覆盖,该怎么办:
var object1 = {
"key": "abc123def456",
"message": {
"subject": "Has a Question",
"from": "example1@example.com",
"to": "example2@example.com"
}
};
var object2 = {
"key": "00700916391", //Overwrite me
"message": { //Dont overwrite me!
"subject": "Hey what's up?", //Overwrite me
"something": "something new" //Add me
}
};
console.log(merge(object1, object2));
将给我们:
{
"key": "00700916391",
"message": {
"subject": "Hey what's up?",
"from": "example1@example.com",
"to": "example2@example.com",
"something": "something new"
}
}
是否有一个Angular函数已经执行了我不知道的深度合并?
如果不是,则有一种本机方法可以在javascript中递归地执行n个级别的操作。
Angular 1.4或更高版本
用途angular.merge
:
不同于
extend()
,merge()
递归地进入源对象的对象属性,执行深层复制。
angular.merge(object1, object2); // merge object 2 into object 1
旧版本的Angular:
没有理由不应该使用简单的递归算法:)
假设它们都是JSON.stringify或类似结果:
function merge(obj1,obj2){ // Our merge function
var result = {}; // return result
for(var i in obj1){ // for every property in obj1
if((i in obj2) && (typeof obj1[i] === "object") && (i !== null)){
result[i] = merge(obj1[i],obj2[i]); // if it's an object, merge
}else{
result[i] = obj1[i]; // add it to result
}
}
for(i in obj2){ // add the remaining properties from object 2
if(i in result){ //conflict
continue;
}
result[i] = obj2[i];
}
return result;
}
(注意,这里不处理数组)
注意 由于JS对象包括的范围非常广,加上ES6又有众多的新特性,很难、也没必要做到囊括所有的类型和情况,这里说的"对象",指的是普通的对象,不包括修改对象原型链, 或者为"Function","Promise"等的情况,请留意。 在ES6中,我们可以很方便的使用Object.assign进行对象合并,但这只是浅层的合并,如果对象的属性为数组或者对象的时候,会导致属性内部的值丢失。 注意: 此处合并
问题内容: Python中是否有一个可用于深度合并字典的库: 以下: 当我结合时,我希望它看起来像: 问题答案: 我希望我不会重新发明轮子,但是解决方案相当短。而且,超级有趣的代码。 因此,其想法是将源复制到目标,并且每次源中的命令都进行递归。因此,如果在A中给定元素包含字典而在B中包含任何其他类型,则确实存在错误。
Object.assign和Object spread仅进行浅合并。 问题的一个例子: 输出是您所期望的。但是,如果我尝试以下方法: 而不是 你得到 X被完全覆盖,因为扩展语法只深入一层。这与相同。 有办法做到这一点吗?
问题内容: 当我声明以下初始状态时: 我用这样更新状态: 结果对象仅定义了年龄。但据我所知,将其参数合并到现有状态。为什么它在这里不起作用,这不是应该经常合并吗? 有没有办法在React / ES6中将新对象属性合并为状态对象属性? 问题答案: 执行浅合并。如果metaData是平坦的: 或者使用点差:
本章将介绍如何使用接口在网站上进行对接 在网站<head></head>或<body></body>区域引入小能 js <script id="xiaonengjs" src="//visitor.ntalker.com/visitor/js/xiaoneng.js?siteid=您的网站id"></script> 如果您需要更新用户信息,如身份信息,您可以添加以下代码xn('setCustom
问题内容: 通过启用AngularJS中的html5Mode时,当您进入站点更深的页面时,导航似乎偏斜。 例如: 当我导航到根目录时,我可以单击站点中的所有链接,Angular 会接管整个站点的导航并加载正确的视图。 但是当我导航到该URL时(或者当我进入上述类似的深层链接时点击刷新…),该导航无法正常工作。首先,按照$ locationProvider.html5Mode的文档规定,我们捕获服务