javascript - 如何将 JSON 转换为索引数组

标签 javascript arrays json sorting

我将从 Firebase 数据库接收到的数据转换为适合在 SectionList 上使用的格式。

我已经能够创建数据结构的某些部分,但无法关联数据。

SectionList的格式如下:

[
         {
           index: 0,
           title: "Pan simple",
           data: [
             {
               id: 0,
             },  
             {
               id: 1,
             } 
           ]
         },
         {
           index: 1,
           title: "Pan dulce",
           data: [
             {
               id: 0,
             }

           ]
       }
   ]

我从数据库收到的格式如下:

"storeName": { 
     products: { 
         '-Lo7D2Y8ZVEXnJb5LMvd': { 
             name: 'Pan de molde',
             category: 'Molde' 
         },
         '-Lo7C4HAkeE0cssxg9E-': { 
             name: 'Bollo de Hamburguresa',
             category: 'Hamburguesa' 
         } 
     },
     category: { 
         Molde: { 
             '-Lo7D2Y8ZVEXnJb5LMvd': true 
         },
         Hamburguesa: { 
             '-Lo7C4HAkeE0cssxg9E-': true 
         } 
      } 
  }

其中“标题”是类别键,“数据”是产品上的对象> 分支机构。 我有这个函数来接收数据并转换它:

   export default (props, storeName) => {
      firebase
        .database()
        .ref(`Store/${storeName}`)
        .on("value", function(snapshot) {
          if (snapshot.val() != null) {
            var values = snapshot.val() || {};
            var dataFormat = [];
            var x = 0;
            for (var i in values.category) {
              var data = Object.assign({
                data: [],
                index: x,
                category: i
              });
              dataFormat.push(data);
              x++;
}
        console.log("Data", dataFormat);
      }
    });
};

当前输出为

[ 
    { data: [], index: 0, category: 'Molde' },
    { data: [], index: 1, category: 'Hamburguesa' } 
]

预期输出将是:

[ 
  { 
    data: [
      {
       id: 'Lo7D2Y8ZVEXnJb5LMvd', 
       name: 'Pan de molde',
       category: 'Molde' 
      }
    ], 
    index: 0, 
    category: 'Molde' 
  },
  { 
    data: [
      { 
        id: '-Lo7C4HAkeE0cssxg9E-',
        name: 'Bollo de Hamburguresa',
        category: 'Hamburguesa' 
      }
    ], 
    index: 1, 
    category: 'Hamburguesa' 
  } 
]

如何将适当的数据放入每个部分?

最佳答案

一些事情:

  • 您检查 snapshot.val() 是否为 != null,因此无需执行 var value = snapshot.val() || {}; - 你知道它是真的
  • Object.assign 与对象文字是多余的,只需使用文字
  • 您使用的是 ES6,不需要坚持使用 var
  • map 替换 for 循环会更优雅
  • 您在问题中发布的输入似乎在任何地方都不包含产品 ID,因此我在这里跳过了它;如果您用更多信息更新问题,我也很乐意对此进行解释。

考虑到这一点,这是我的建议:

export default (props, storeName) => {
  firebase
    .database()
    .ref(`Store/${storeName}`)
    .on("value", function(snapshot) {
      const values = snapshot.val();
      if (values) {
        const dataFormat = Object.keys(values.category)
          .map((category, index) => ({
            category,
            index,
            data: Object.values(values.products).filter(
              product => product.category === category
            )
          }));
        console.log("Data", dataFormat);
      }
    });
};

关于javascript - 如何将 JSON 转换为索引数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837235/

相关文章:

javascript - React Native Get Async Storage 返回未处理的 Promise

javascript - 在 JavaScript 性能方面模仿 C 数组的结构处理

javascript - 使用 Angularjs 将动态数据从 Json 获取到 Html

java - 找出集合的所有可能的和

php - 从数据库中检索数据

python - JSON对象解析以及如何转义unicode字符

sql - 在 SQL Server 2012 中使用 JSON

c# - 为什么 IE9+ 上的网络浏览器不支持 document.createEvent 以及如何修复它?

javascript - 多个 chrome.webNavigation.onHistoryStateUpdated 不工作

javascript 如何判断一个数字是否是另一个数字的倍数