我有一個序列陣列,我想要實作的是最后一個物件的完成屬性為真,然后下一個物件的下一個物件的is_to_happen為真
輸入
const sequences = [
{
"title": "Order placed",
"completed": true
},
{
"title": "To be confirmed",
"completed": false
},
{
"title": "Approx Thursday product will be shipped",
"completed": false
}
]
這就是我想要的預期輸出
const output = [
{
"title": "Order placed",
"completed": true,
"is_to_happen": false
},
{
"title": "To be confirmed",
"completed": false,
"is_to_happen": false
},
{
"title": "Approx Thursday product will be shipped",
"completed": false,
"is_to_happen": true
}
]
到目前為止我嘗試使用 array.reduce 的方法不起作用
sequences.reduce((acc,curr) => {
acc = [...acc, curr]
if(curr.completed){
acc = [...acc, {...curr, is_to_happen: true}]
}
return acc
}, [])
uj5u.com熱心網友回復:
Usea reduce,并跟蹤completed專案的索引:
const sequences = [
{
"title": "Order placed",
"completed": true
},
{
"title": "To be confirmed",
"completed": false
},
{
"title": "Approx Thursday product will be shipped",
"completed": false
},
{ "title": "One more step", "completed": false }
]
const result = sequences.reduce ( (acc,item, i) => {
if(item.completed) acc.completedIndex = i;
acc.items.push( {...item,"is_to_happen": (acc.completedIndex != -1) && (i >= acc.completedIndex 2) } );
return acc;
},{items:[], completedIndex:-1});
console.log(result.items);
實作相同目的的另一種方法是向后查看completed標志的原始陣列中的 2 個元素
const sequences = [
{
"title": "Order placed",
"completed": true
},
{
"title": "To be confirmed",
"completed": false
},
{
"title": "Approx Thursday product will be shipped",
"completed": false
}
]
const result = sequences.map ( (item, i) => {
return {...item, is_to_happen: !!sequences[i-2]?.completed};
});
console.log(result);
uj5u.com熱心網友回復:
這是一種方法:
const todo = [
{
"title": "Order placed",
"completed": true
},
{
"title": "To be confirmed",
"completed": false
},
{
"title": "Approx Thursday product will be shipped",
"completed": false
}
]
// find last completed
var lastCompleted = todo.slice().reverse().find(item => item.completed === true);
// get the index of the next to the next item.
var nextToDoIndex = todo.indexOf(lastCompleted) 2;
// only change it if it exists.
if(todo[nextToDoIndex]) todo[nextToDoIndex] = {...todo[nextToDoIndex], is_to_happen: true }
console.log(todo)
uj5u.com熱心網友回復:
sequences.reduce((acc, curr) => {
if (curr.completed)
acc = [...acc, { ...curr, is_to_happen: true }]
else
acc = [...acc, { ...curr, is_to_happen: false }]
return acc
}, [])
嘗試這個。
uj5u.com熱心網友回復:
sequences.reduce((acc, curr, i, arr) => {
if (i === arr.length-1)
acc = [...acc, { ...curr, is_to_happen: true }]
else
acc = [...acc, { ...curr, is_to_happen: false }]
return acc
}, [])
嘗試這個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/363934.html
標籤:javascript
上一篇:使用反應鉤子選擇多個專案?
