JavaScript数组引用数组位置(而不是元素)

5

更新:

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

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

Nina Scholz的答案似乎解决了这个问题。


有没有办法在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 将会不断地异步变化。

是否存在一种“响应式”处理数组的方法?


可能是重复问题 https://dev59.com/0GQm5IYBdhLWcg3wug_S - ClickThisNick
3
可能是 JavaScript 中是否有指针? 的重复问题。 - Laurens Deprost
2
你的指针总是指向同一个数组吗?如果是这样,只需创建一个索引数组即可。 - Barmar
1
@LaurensDeprost 我认为那里的任何答案都不能帮助解决这个问题。 - Barmar
1
你想通过这个做什么?如果你想要索引 0 处的对象,只需要使用 arr[0] ... 它会返回此时的当前值。 - Herohtar
请将您的 更新 放在原始消息下方而不是上方。 - noraj
3个回答

5

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

const pointer = [0, 1];

那么你可以使用以下代码:

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

如果你的指针可以指向不同的数组,你可以将指针的元素设置为包含对数组及其索引的引用的对象。
const pointer = [{a: arr, i: 0}, {a: arr1, i: 1}];
console.log(pointer.map(({a, i}) => a[i]));

有趣的一面:几十年前,我使用过Symbolics Lisp Machines的C语言实现。这基本上是它表示C指针的方式。

我更新了我的问题。即使我可以保持索引,我仍然需要再次调用该方法。实际上,我正在寻找数组内的“getter”,但我不知道:x 无论如何,这是指向数组位置而不是值的绝佳方式。 - Gustavo Lopes

4
你可以使用一个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 反射来实现这个功能? - Gustavo Lopes
1
你需要使用defineProperty来定义单个属性,或者使用defineProperties来定义多个属性。没有其他的解决方法,因为每个对象都只是数组中的对象,而不是元函数。 - Nina Scholz

1

您可以使用代理(不支持IE)和捕获器一起使用:

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接