gpt4 book ai didi

javascript - 通过 defineProperty 添加到 javascript 中的数组 - 有更好的方法吗?

转载 作者:行者123 更新时间:2023-11-29 14:40:05 26 4
gpt4 key购买 nike

目标是在二维 javascript 数组中创建一个动态“总和”行。这是起点:

var m = [[1,2,3], [4,5,6]];

我们可以这样添加第三行:

Object.defineProperty(m, 2, { get: () => m[0].map((e, i)=> e + m[1][i]) })

所以现在我们的数组是

[[1,2,3], [4,5,6], [5,7,9]]

有效!设置m[0][0]=10我们得到

[[10,2,3], [4,5,6], [14,7,9]]

这正是我想要的。 m.length = 3正如预期的那样,总和行被视为数组的一部分。 JSON.stringify也按预期工作。 (我有点惊讶它起作用了)。

我的问题是 - 有没有一种方法可以在不求助于 defineProperty 的情况下生成依赖于其他部分的二维数组的部分? ?这是要避免的事情吗?

(注意——在我最初的问题中,我已经完成了上述操作,然后将 m[2] 更改为其他内容。“属性”赢得了数组成员,这导致了一些困惑。这本身可能是不这样做的原因使用上面的方法。Apolgies。)

最佳答案

It works! I was a bit surprised it worked tbh.

是的。数组只是具有特殊 .length 属性的对象,索引只是普通属性。这意味着如果您愿意,您可以让它们成为二传手。

顺便说一句,您可以通过在 getter 中使用 this 而不是总是引用 m 来改进它:

var thirdRowDescriptor = {
enumerable: true,
configurable: true,
get() {
return this[0].map((x, i) => x + this[1][i]);
}
};
Object.defineProperty(m, 2, thirdRowDescriptor);
// or use the same descriptor on any other arrays

Is there a better way of generating parts of a 2d array dependent on other parts without resorting to defineProperty?

不,使用 Object.defineProperty 创建的 getter 似乎正是您想要的。有许多其他方法可以动态生成依赖于其他数组的数组,但没有一种真正使其成为外部数组的“一部分”。

Is this something to avoid?

可能吧。我很确定它会破坏外部数组(你添加了 setter/getter )的性能,因为引擎无法轻松优化索引访问。但是,如果这真的只是一个您想要添加另一列的两列对象,那么这应该不是问题。只是不要在大型​​阵列或动态增长/缩小的阵列上这样做。如果外部结构无论如何都是静态的,那么使用普通对象(而不是数组)可能是更好的选择。

关于javascript - 通过 defineProperty 添加到 javascript 中的数组 - 有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39545302/

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