gpt4 book ai didi

javascript - 这个对象合并功能可能会出现哪些错误?

转载 作者:行者123 更新时间:2023-12-02 14:15:53 25 4
gpt4 key购买 nike

我开始寻找并理解一种在 Vanilla JS 中合并对象的好方法。我对功能的要求很简单(借用 here ):

  • 深度合并两个对象xy,返回一个新的合并对象,其中包含x的元素y

  • 如果 xy 都存在同一键的元素,则 y 中的值将出现在结果。

  • 合并是不可变的,因此 xy 都不会被修改。

我遇到了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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com