簡體   English   中英

用於嵌套數據結構處理的遞歸異步JavaScript

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM