【问题标题】:Javascript array referencing an array position (not an element)引用数组位置(不是元素)的 Javascript 数组
【发布时间】:2018-12-31 20:34:50
【问题描述】:

更新:

许多人问为什么不使用[arr[0], arr[1]]。问题是我必须将此数组传递给我无权访问Angular Material Table 的方法。而且我不想一遍又一遍地调用该方法。

我已经处理了arr 数组,我不想处理pointer 数组来反映我已经知道它在哪里的新数据。

Nina Scholz answer 似乎解决了这个问题。


有没有办法在 Javascript 中使用像 C 这样的“指针”?

我想做的是:

我有一个包含对象的数组

const arr = [
    {prop: 3},
    {prop: 4},
];

我想要一个数组来指向这个数组的位置

const pointer = [arr[0], arr[1]]; // I want pointer to point to be an array containing the first and second elements of arr

这将获得对 {prop: 3}{prop: 4} 对象的引用,这不是我想要的,因为如果我这样做:

arr.splice(0, 0, {prop: 1}); // arr => [{prop:1},{prop:3},{prop:4}]
console.log(pointer); // [{prop: 3},{prop: 4}]

如您所见,pointer 持有对对象{prop:3}{prop:4} 的引用。

如何实现pointer 来保存对数组位置0 的引用,而不是存储在其中的对象?那么,在这个例子中,pointer => [{prop:1},{prop:3}]?

我不能一直调用pointer = [arr[0], arr[1]],因为arr 会不断地异步变化。

是否有一种“反应式”的方式来处理数组?

【问题讨论】:

  • 你的指针总是指向同一个数组吗?在这种情况下,只需创建一个索引数组。
  • @LaurensDeprost 我认为那里的任何答案都不会对此有所帮助。
  • 你想用这个实现什么?如果您想要索引0 处的对象,只需使用arr[0]...它将返回当时的当前值。

标签: javascript arrays


【解决方案1】:

如果你的指针总是指向同一个数组,你可以简单地存储索引。

const pointer = [0, 1];

然后你会使用:

console.log(pointer.map(ptr => arr[ptr]));

如果您的指针可以指向不同的数组,您可以使pointer 的元素成为包含对数组的引用及其索引的对象。

const pointer = [{a: arr, i: 0}, {a: arr1, i: 1}];
console.log(pointer.map(({a, i}) => a[i]));

有趣的是:几十年前,我使用 C 实现 Symbolics Lisp 机器。这基本上就是它表示 C 指针的方式。

【讨论】:

  • 我更新了我的问题。即使我可以保存索引,我仍然需要再次调用该方法。我实际上是在数组中寻找getter,但我不知道:x 无论如何,这是将point 定位到数组位置而不是值的好方法。
【解决方案2】:

您可以使用 getter 函数并返回实际对象的元素。

const arr = [{ prop: 3 }, { prop: 4 }];
const pointer = [];

Object.defineProperty(pointer, 0, { get() { return arr[0]; } });
Object.defineProperty(pointer, 1, { get() { return arr[1]; } });

arr.splice(0, 0, { prop: 1 });
console.log(pointer);

【讨论】:

  • 感谢您的回答。它看起来像我一直在寻找的东西。另一个问题,有没有更直接的方法在数组中创建getter?还是我必须使用Object 反射来实现这一点?
  • 您需要defineProperty 用于单个属性或defineProperties 用于多个属性。没有就没有解决方法,因为每个对象都只是数组中的对象,而不是元函数。
【解决方案3】:

您可以使用Proxy(IE 不支持)和get trap

const arr = [{ prop: 3 }, { prop: 4 }];

const pointer = new Proxy([], {
  get(target, prop, receiver) {
    // if the prop is a string that can be converted to a number
    // return the corresponding value from the arr
    if(typeof prop === 'string' && !isNaN(Number(prop))) return arr[target[prop]];

    return Reflect.get(target, prop, receiver);
  }
});

pointer.push(0, 1);
console.log(pointer);

arr.splice(0, 0, { prop: 1 });
console.log(pointer);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2022-11-19
    • 2019-04-22
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多