如何获取ES6循环的上一个元素。
例如,如果我有这样写的for循环:
for (let item of data){
console.log(item.name)
}
我还想获取循环的前一项的名称:
我尝试过:
data[item-1].name
这不起作用。
当我使用ES5阵列
for(let i =0;i<details.length;i++){
console.log(details[i-1].PartNumber)
}
给了我循环的前一个元素。我不确定如何使用新语法
答案 0 :(得分:3)
您可以将对先前对象的引用保存到单独的变量中。
let data = [{name: 'name1'}, {name: 'name2'}, {name: 'name3'}, {name: 'name4'}, {name: 'name5'}];
let prev;
for (let item of data){
console.log({current: item.name, previous: prev && prev.name})
prev = item;
}
答案 1 :(得分:2)
另一种解决方案是定义一个generator function,该迭代对值对进行迭代,其中每个对都具有该迭代的先前值和当前值。这样做可以让您以合理干净清晰的方式使用for .. of
流控制进行迭代。
一种简单的方法如下:
const data = [1,2,3,4];
/* Define generator function which returns
a pair of previous/current values from input
iteratable, per iteration */
function *iteratePairs(iteratable) {
let prev;
for(const item of iteratable) {
// Return the pair for this iteration
yield [prev, item]
// Update the previous item
prev = item;
}
}
// Invoke the iteratePairs generator using for..of
// flow control
for (let pair of iteratePairs(data)){
console.log(pair)
}
希望有帮助!
答案 2 :(得分:1)
如果要使用for..of
并访问上一个索引,请首先在数组上调用.entries()
,这样既得到键又得到了值,然后您可以使用方括号表示法来查找i - 1
属性:
for (const [i, value] of data.entries()){
if (i >= 1) {
console.log(data[i - 1].PartNumber);
}
}
const data = [
{ PartNumber: 0 },
{ PartNumber: 1 },
{ PartNumber: 2 },
]
for (const [i, value] of data.entries()){
if (i >= 1) {
console.log(data[i - 1].PartNumber);
}
}
答案 3 :(得分:1)
你不知道。那就是重点。 ES6 for-of循环将索引的概念抽象化了,如果需要简单的循环,则应使用ES6。如果您要基于索引手动访问元素,那么使用简单的for
循环就没错。
但是您能做的是这
for(let [idx, elem] of Object.entries(arr)) {
console.log(arr[idx -1]);
}
但是我建议使用一个简单的for
循环。