- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始寻找并理解一种在 Vanilla JS 中合并对象的好方法。我对功能的要求很简单(借用 here ):
深度合并两个对象x
和y
,返回一个新的合并对象,其中包含x
和的元素y
。
如果 x
和 y
都存在同一键的元素,则 y
中的值将出现在结果。
合并是不可变的,因此 x
和 y
都不会被修改。
我遇到了this文章似乎提供了一个非常好的解决方案。在浏览完代码并理解它(大部分)之后,我将其缩短为以下内容:
var extend = function() {
var extended = {};
var length = arguments.length;
// Merge the object into the extended object
var merge = function(obj) {
for (var prop in obj) {
//Check if a property is an object and another layer of merging is required
if (Object.prototype.toString.call(obj[prop]) === '[object Object]') {
extended[prop] = extend(true, extended[prop], obj[prop]);
} else {
extended[prop] = obj[prop];
}
}
};
// Loop through each object and conduct a merge
while (length--) {
var obj = arguments[length];
merge(obj);
}
return extended;
};
从原始解决方案中,我删除了对深度合并的检查,因为我希望默认情况下进行深度合并,并且在检查当前合并的属性值是否为对象之前存在此行:
if ( Object.prototype.hasOwnProperty.call( obj, prop ) )
我不明白这一行 - 为什么我们应该检查当前正在循环的属性的对象是否具有当前循环中的属性?我觉得我失去了一些东西。
就是这样。有没有什么情况下这个功能不能满足我的要求?或者以其他方式中断执行?谢谢。
最佳答案
if ( Object.prototype.hasOwnProperty.call( obj, prop ) )
I don't understand this line - why should we check if the object whose properties are currently being looped through has the property from the current loop?
因为for-in
循环访问对象的所有可枚举属性,包括从其原型(prototype)继承的属性。是否要复制继承的属性取决于您的 extend
函数的用例。显然在原始代码中,他们不想这样做。
显示差异的示例:
var name;
var p = {inherited: "property"};
// Create an object using p as its prototype
var o = Object.create(p);
o.own = "property";
console.log("Without check");
for (name in o) {
console.log("- " + name);
}
console.log("With check");
for (name in o) {
if (Object.prototype.hasOwnProperty.call(o, name)) {
console.log("- " + name);
}
}
关于javascript - 这个对象合并功能可能会出现哪些错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39043530/
java.lang.Throwable 的哪些子类可能被空语句抛出? 通过短语“空语句”,我指的是“无”、“分号”和“分号”: // .... A(); B(); C(); try { //
我是一名优秀的程序员,十分优秀!