假设我想用一组装饰器替换一个对象数组:
var arr = [{id:1, text: "text1"}, {id:2, text: "text2"}, {id:3, text: "text3"}];
arr.forEach(function(el, idx){
var newEl = new NewEl(el.id, el.text, arr[idx + 1], idx);
arr[idx] = newEl;
}, this);
console.log(arr);
function NewEl(id, text, nextEl, idx){
this.id = id;
this.text = text;
this.next = nextEl;
}
nextEl
仍然会引用旧对象,而不是数组中的下一个项目(无论该元素是什么)。
如何将对数组中下一个元素(位置)的引用传递给构造函数?
注意:如果可能,我不希望通过修改循环内的逻辑来使用变通方法(涉及在下一次迭代中设置' next' on the next element)的解决方法。
有可能吗?
答案 0 :(得分:4)
在创建参考之前,您无法使用参考(我确定这很明显)。因此,如果不改变循环来查看前一个,就很难解决。但是,如果您必须在不查看以前创建的项目的情况下解决此问题,则可以更改NewEl
以接收完整数组和下一个索引,而不是实际参考。如下所示:
function NewEl(id, text, arr, nextIndex){
this.id = id;
this.text = text;
this.arr = arr;
this.nextIndex = nextIndex;
}
NewEl.prototype.getNext = function(){
return this.arr[this.nextIndex];
};
这个想法是你在创建它之前使用引用的唯一方法是实际不使用它,但是存储一种访问它的方式以后。然而,这是一种可怕的方法,因为对数组的任何更改都会破坏getNext()
函数。
<强> tldr;你应该只是改变循环来引用上一个项目,从下一次迭代开始。
答案 1 :(得分:1)
你也可以这样做
var arr = [{id:1, text: "text1"}, {id:2, text: "text2"}, {id:3, text: "text3"}];
arr.reduceRight((p,c) => (c.next = p,c));
arr.reduce((p,c) => (c.prev = p,c));
因为在一条评论中你提到你以前也喜欢上一个属性。