【问题标题】:How to write Logic for given output?如何为给定的输出编写逻辑?
【发布时间】:2020-02-01 11:10:00
【问题描述】:

我正在尝试为给定的输入编写逻辑,我需要 JavaScript 中的所需输出。

给定输入:

var test = [{parentId:1,subId:1,subSubId:1},
{parentId:1,subId:2,subSubId:null},
{parentId:1,subId:null,subSubId:null},
{parentId:2,subId:1,subSubId:1},
{parentId:2,subId:null,subSubId:null}];

预期输出:

{
  "category": [
    {
      "parentId": 1,
      "subCatgory": [
        {
          "subId": 1,
          "subSubCategory": [
            {
              "subSubId": 1
            }
          ]
        },
        {
          "subId": 2
        }
      ]
    },
    {
      "parentId": 2,
      "subCatgory": [
        {
          "subId": 1
        }
      ]
    }
  ]
}

【问题讨论】:

  • 你能分享你产生当前结果的代码吗?
  • 我认为@technophyle 想说的是我们需要看到解决问题的尝试。 “但到目前为止没有运气”还不够好。这不是代码编写服务。你尝试了什么?到底出了什么问题?

标签: javascript reactjs


【解决方案1】:

此代码可以执行此操作:

const test = [{
    parentId: 1,
    subId: 1,
    subSubId: 1
  },
  {
    parentId: 1,
    subId: 2,
    subSubId: null
  },
  {
    parentId: 1,
    subId: null,
    subSubId: null
  },
  {
    parentId: 2,
    subId: 1,
    subSubId: 1
  },
  {
    parentId: 2,
    subId: null,
    subSubId: null
  }
];

const parse = (data) => {
  const category = data.reduce((acc, { parentId, subId, subSubId }) => {
    let parent = acc.find(v => v.parentId === parentId)
    if (!parent) {
      parent = { parentId, subCategory: [] }
      acc.push(parent)
    }

    if (!subId) return acc
    let subCatetogy = parent.subCategory.find(v => v.subId === subId)
    if (!subCatetogy) {
      subCatetogy = { subId }
      parent.subCategory.push(subCatetogy)
    }
    
    if (!subSubId) return acc
    subCatetogy.subSubCategory = subCatetogy.subSubCategory || []
    subCatetogy.subSubCategory.push({ subSubId })
    return acc
  }, [])
  return { category }
}

console.log(parse(test))

注意:您似乎拼错了subCatgory,因此我将其更改为subCategory。 parentId: 2 在我的解决方案中也有 subSubId: 1,虽然它在您的测试变量中,但它似乎在您想要的结果中缺失。

希望我的回答对你有用:)

【讨论】:

    【解决方案2】:

    此代码可以完成您需要做的事情。当subId 和subSubId 都是null 时,它也可以工作。请检查:

    const testData = [
      {
        parentId: 1,
        subId: 1,
        subSubId: 1
      },
      {
        parentId: 1,
        subId: 2,
        subSubId: null
      },
      {
        parentId: 1,
        subId: null,
        subSubId: null
      },
      {
        parentId: 2,
        subId: 1,
        subSubId: 1
      },
      {
        parentId: 2,
        subId: null,
        subSubId: null
      },
      {
        parentId: 3,
        subId: null,
        subSubId: null,
      }
    ];
    
    function generateData(data) {
      /**
       * This will generate a map of objects that looks like this:
       *  map = {
       *    // parentId
       *    1: {
       *      // subId
       *      1: [
       *        // subSubId
       *        1,
       *        2,
       *        ...
       *      ],
       *      ...
       *    },
       *    ...
       *  }
       */
      const map = data.reduce((result, { parentId, subId, subSubId }) => {
        if (result[parentId]) {
          if (!subId) return result;
          if (result[parentId][subId]) {
            if (!subSubId) return result;
            result[parentId][subId].push(subSubId);
          } else {
            result[parentId][subId] = subSubId ? [subSubId] : [];
          }
        } else {
          if (subId) {
            result[parentId] = { [subId]: subSubId ? [subSubId] : [] };
          } else {
            result[parentId] = {};
          }
        }
        return result;
      }, {});
    
      const categories = Object.keys(map).map(parentId => {
        const parent = map[parentId];
        const category = { parentId };
        const subCategories = Object.keys(parent).map(subId => {
          const subSubs = parent[subId];
          const subCategory = { subId };
          if (subSubs.length) {
            subCategory.subSubCategory = subSubs.map(subSubId => ({ subSubId }));
          }
          return subCategory;
        });
        if (subCategories.length) {
          category.subCategory = subCategories;
        }
        return category;
      });
    
      return { category: categories };
    }
    
    const result = generateData(testData);
    console.log(result);

    我添加了一些cmets,以便您可以轻松理解它,但是要完全理解逻辑需要一些时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多