gpt4 book ai didi

javascript - 在 Javascript 中,执行深层复制时,由于属性为 "this",如何避免循环?

转载 作者:可可西里 更新时间:2023-11-01 01:41:33 25 4
gpt4 key购买 nike

我有一些库代码在我身上无休止地循环。

我不清楚如何在 javascript 中最好地执行循环检测和避免。也就是说,没有程序化的方法来检查对象是否来自“this”引用,是吗?

这是代码。谢谢!

setAttrs: function(config) {
var go = Kinetic.GlobalObject;
var that = this;

// set properties from config
if(config !== undefined) {
function setAttrs(obj, c) {
for(var key in c) {
var val = c[key];

/*
* if property is an object, then add an empty object
* to the node and then traverse
*/
if(go._isObject(val) && !go._isArray(val) && !go._isElement(val)) {
if(obj[key] === undefined) {
obj[key] = {};
}
setAttrs(obj[key], val); // <--- offending code;
// one of my "val"s is a "this" reference
// to an enclosing object
}

最佳答案

我所知道的处理这种情况的“可靠而干净”的方法是使用“已访问”对象的集合,然后根据当前对象是否已访问来使用react——终止、插入符号引用等是否被“访问”。

先生。 Crockford 在 cycle.js 中使用了这种方法他使用一个数组来收集。摘录:

// If the value is an object or array, look to see if we have already
// encountered it. If so, return a $ref/path object. This is a hard way,
// linear search that will get slower as the number of unique objects grows.

for (i = 0; i < objects.length; i += 1) {
if (objects[i] === value) {
return {$ref: paths[i]};
}
}

不幸的是,在 JavaScript 中不可能为此使用原始的“哈希”方法,因为它缺少身份映射。虽然数组集合边界是 O(n^2)并不像听起来那么糟糕:

这是因为,如果“已访问”集合只是一个守卫,那么 n 的值就是堆栈的深度:只有循环才是重要的,而多次复制同一个对象是重要的不是。也就是说,“已访问”集合中的对象可以在堆栈展开时被 trim 。

在 cycle.js 代码中,“已访问”集合不能被删减,因为它必须确保始终使用给定对象的相同符号名称,这允许序列化在恢复时“维护引用”。然而,即使在这种情况下,n只是遍历的唯一非原始值的数量。

我能想到的唯一其他方法需要将“访问的属性”直接添加到正在遍历的对象,我认为这是一个通常不受欢迎的功能。 (但是,请参阅 Bergi 关于此工件 [相对] 容易清理的评论。)

快乐编码。

关于javascript - 在 Javascript 中,执行深层复制时,由于属性为 "this",如何避免循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10728412/

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