[英]recursive asynchronous JavaScript for nested data structure processing
我正在尋找一個JavaScript函數,它將以下數據結構作為參數:
let data = [
{value: 'a'},
{delay: [
{value: 'b'},
{delay: [
{value: 'c'}
]}
]},
{value: 'd'}
];
如您所見,數據結構是一個對象數組。 每個對象都包含一個屬性。 這些屬性中的每一個都是帶有字符串的“值”或帶有與其值相同類型的另一個數組的“延遲”。
該函數應該向控制台打印每個“值”字符串,並在以相同方式處理延遲數組之前為每個“延遲”暫停兩秒鍾。 該函數應支持任何深度的延遲嵌套。 上面顯示的兩級深度延遲嵌套只是一個例子。
對於上面的示例數據,控制台的功能輸出應該是(按此順序,只有這個順序):
a
b
c
d
如何編寫代碼來實現此功能?
您可以使用Promises和async / await:
let data = [ {value: 'a'}, {delay: [ {value: 'b'}, {delay: [ {value: 'c'} ]} ]}, {value: 'd'} ]; const delay = () => new Promise( res => setTimeout( res, 2000) ) const recFn = async data =>{ for(let obj of data){ if(obj.value){ console.log(obj.value) } else if(obj.delay){ await delay(); await recFn(obj.delay) } } } recFn(data);
這是一個想法。 你最終得到的是一個values
數組,看起來像["a", "delay", "b", "delay", "c", "d"]
此外, 這是一個工作小提琴 。
let data = [
{value: 'a'},
{delay: [
{value: 'b'},
{delay: [
{value: 'c'}
]}
]},
{value: 'd'}
];
let values = [];
while(data.length) {
if(typeof data[0].value !== 'undefined') {
values.push(data[0].value);
data.shift();
}else {
values.push('delay');
var delayArray = data[0].delay;
data.shift();
data = delayArray.concat(data);
}
};
outputDelay(values);
function outputDelay(elements) {
if(!elements.length) return false;
if(elements[0] == "delay") {
setTimeout(function(){
elements.shift();
outputDelay(elements);
}, 2000);
} else {
console.log(elements[0]);
elements.shift();
outputDelay(elements);
}
}
使用async
/ await
和object destructuring,這是一種更易讀的遞歸遍歷和打印對象的方法:
let data = [ { value: 'a' }, { delay: [ { value: 'b' }, { delay: [ { value: 'c' } ] } ] }, { value: 'd' } ] function sleep(ms) { return new Promise(resolve => { setTimeout(resolve, ms) }) } async function walk(array) { for (const { value, delay } of array) { if (value) { console.log(value) } else if (delay) { await sleep(1000) await walk(delay) } } } walk(data)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.