遍历对象的嵌套数组,并用动态值替换空属性-Javascript

时间:2019-11-29 11:25:16

标签: javascript arrays object

我有一个嵌套对象,如下所示。一些对象中的content属性为空。我需要遍历所有对象,如果它具有空的 content 属性,我需要为其提供一个像 Default value 这样的值。

var data = [{
    title: "Admin Services",
    content: "admin",
    links: [{
        title: "Report",
        content: "",
        links: [{
            title: "Notifications",
            content: "Notify",
            links: [{
                title: "Send",
                content: "",
                links: [{
                    title: "read",
                    content: "",
                    links: [],
                }]
            }]
        }]
    }, {
        title: "Script",
        content: "script",
        links: [{
            "title": "Execute",
            content: "",
            links: []
        }]
    }, {
        title: "Process",
        content: "",
        links: []
    }]
}];

function checkEmptyContent(data){
      data.forEach((item)=>{
          if(item.links.length > 0){
             checkEmptyContent(item.links)
          }
          if(item.content === ""){    
              item.content = "Default Content";
          }
      });
}

checkEmptyContent(data); 
console.log('data',data);

我得到如下输出

[
  {
    "title": "Admin Services",
    "content": "admin",
    "links": [
      {
        "title": "Report",
        "content": "Default Content",
        "links": [
          {
            "title": "Notifications",
            "content": "Notify",
            "links": [
              {
                "title": "Send",
                "content": "Default Content",
                "links": [
                  {
                    "title": "read",
                    "content": "Default Content",
                    "links": []
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "title": "Script",
        "content": "script",
        "links": [
          {
            "title": "Execute",
            "content": "Default Content",
            "links": []
          }
        ]
      },
      {
        "title": "Process",
        "content": "Default Content",
        "links": []
      }
    ]
  }
]

最终的要求是,不仅要添加默认文本,还要添加一个如下所示的计数器

[
  {
    "title": "Admin Services",
    "content": "admin",
    "links": [
      {
        "title": "Report",
        "content": "Default Content (0)",
        "links": [
          {
            "title": "Notifications",
            "content": "Notify",
            "links": [
              {
                "title": "Send",
                "content": "Default Content (1)",
                "links": [
                  {
                    "title": "read",
                    "content": "Default Content (2)",
                    "links": []
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "title": "Script",
        "content": "script",
        "links": [
          {
            "title": "Execute",
            "content": "Default Content (0)",
            "links": []
          }
        ]
      },
      {
        "title": "Process",
        "content": "Default Content (0)",
        "links": []
      }
    ]
  }
]

对于数组中的每个对象,计数器应从0开始

2 个答案:

答案 0 :(得分:2)

您可以为此使用递归,方法是对每个嵌套数组重复使用addDefault()函数。通过遍历数组中的每个对象,可以检查它是否具有content,如果没有,可以向其中添加“默认内容(0)”字符串:

const data = [{title:"Admin Services",content:"admin",links:[{title:"Report",content:"",links:[{title:"Notifications",content:"Notify",links:[{title:"Send",content:"",links:[{title:"read",content:"",links:[]}]}]}]},{title:"Script",content:"script",links:[{title:"Execute",content:"",links:[]}]},{title:"Process",content:"",links:[]}]}];

const addDefault = (arr, level=0) => {
  arr.forEach(obj => {
    obj.content = obj.content || `Default Content (${level++})`;
    addDefault(obj.links, level);
    level = 0;
  });
}

addDefault(data);
console.log(data);

答案 1 :(得分:0)

我已经修改了您的逻辑,请检查一下,

function checkEmptyContent(data){
    data.forEach((item)=>{
        if(!item.content.length){    
            item.content = "Default Content";
        }
        if(item.links.length > 0){
           checkEmptyContent(item.links)
        }
    });
}

checkEmptyContent(data); 
console.log('data',data);