获取下一个数组元素

时间:2016-05-15 03:47:15

标签: javascript arrays

假设我想用一组装饰器替换一个对象数组:

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)的解决方法。

有可能吗?

2 个答案:

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

因为在一条评论中你提到你以前也喜欢上一个属性。