访问array.map中先前迭代的元素



在JavaScript中,我有一个对象数组,其中包含id、名称和一些其他属性,我正在映射这些属性以创建一个具有修改属性的新对象。其中一个属性需要具有与上一个迭代元素相关的值。即它的前身:

let returnedArrOfObjs = [{id: 1, name: 'first', predecessor: 'none' },
{id: 2, name: 'second', predecessor:'first'}, 
{id: 3, name: 'third', predecessor: 'second'}] 

有没有一种方法可以访问前面迭代的元素?

这不起作用,因为prevObj没有任何意义,只是为了给我一个尝试:

array.map(obj => {
let rObj = {};
rObj.id = obj.id,
rObj.name = obj.name,
rObj.predecessor = prevObj ? prevObj.name : 'none'
return rObj;
})

.map()有第二个参数→当前循环索引。这样你就可以得到最后一个元素:

let array = [{id: 1, name: 'first' },
{id: 2, name: 'second'}, 
{id: 3, name: 'third'}];

const result = array.map((obj, i) => { // add index in the function parameters
let rObj = {};
rObj.id = obj.id;
rObj.name = obj.name;

const prevObj = i != 0 ? array[i - 1] : null; // If current index != 0, get the prev object
rObj.predecessor = prevObj ? prevObj.name : 'none'
return rObj;
})
console.log(result);

数组map可以有第三个参数,即数组本身。你可以利用它来获得前一个项目:

const result = array.map((obj, index, currentArray) => {
let rObj = {};
rObj.id = obj.id;
rObj.name = obj.name;
// Get the previus object it's not the
// first iteration:
const prevObj = index != 0 
? currentArray[index - 1] 
: null; 
rObj.predecessor = prevObj ? prevObj.name : "none";
return rObj;
});

您的解决方案只遗漏了一部分,即第二个参数。CCD_ 3具有第二个自变量,即CCD_。您可以做的是检查上一个索引中是否有元素。如果是,则使用其name,否则使其成为none

let arrOfObjs = [{id: 1, name: 'first' },
{id: 2, name: 'second'}, 
{id: 3, name: 'third'}] 
let returnedArrOfObjs=arrOfObjs .map((obj,index)=>{
let rObj = {};
rObj.id = obj.id,
rObj.name = obj.name,
rObj.predecessor = arrOfObjs [index-1] ?  arrOfObjs [index-1].name : 'none'
return rObj;
})
console.log(returnedArrOfObjs)

我能想到的另一种方法是使用Array.reduce。它允许您保留通过return传递给下一次迭代的信息。它可能会比其他解决方案更加复杂。

let returnedArrOfObjs = [{id: 1, name: 'first', predecessor: 'none' },
{id: 2, name: 'second', predecessor:'first'}, 
{id: 3, name: 'third', predecessor: 'second'}] 
const { result } = returnedArrOfObjs.reduce(({ prevObj, result }, obj) => {
let rObj = {};
rObj.id = obj.id,
rObj.name = obj.name,
rObj.predecessor = prevObj ? prevObj.name : 'none'
result = [ ...result, rObj ]
return { prevObj: rObj, result }
}, { result: [] })
console.log(result)

最新更新