javascript - 在 Javascript 中转换对象格式

标签 javascript object

我有一个输入对象数组,每个对象都具有以下格式:

{
 titleID: string,
 titleName: string,
 1af23_red: number,
 45ua6_blue: number
}

我知道的是:

  1. 在每个对象中,总是titleIDtitleName 然后我会有几个键具有格式number_string

  2. titleIDtitleName 值在不同的对象之间会有所不同

  3. 其余键(1af23_red、45ua6_blue 等)在所有对象中都相同,并且它们都具有相同的格式“id_name” 因此,如果第一个对象将 1af23_red 和 45ua6_blue 作为键,所有其余的也将只有这些 key 。

我想要返回的数组类型具有以下格式:

{
  color: {
    id
    name
  },
  data: Array<
  {
    title: {
      id
      name
    },
    rating
  }
  >
}

因此,输入示例:

[ 
  { 
    titleId: 'a',
    titleName: 'atitle',
    '1af_red': 50
    'ba2_blue': 40
  },
  {
    titleId: 'b',
    titleName: 'btitle',
    '1af_red': 30
    'ba2_blue': null
  },
  {
    titleId: 'c',
    titleName: 'ctitle',
    '1af_red': null
    'ba2_blue': 10
  }
]

我希望得到返回:

[
  {
    color: {
      id: '1af',
      name: 'red'
    },
    data: [
      {
        title: {
          id: 'a',
          name: 'atitle',
        },
        rating: 50
      }, 
      {
        title: {
          id: 'b',
          name: 'btitle',
        },
        rating: 30
      },
      {
        title: {
          id: 'c',
          name: 'ctitle',
        },
        rating: null
      }
    ]
  },
  {
    color: {
      id: 'ba2',
      name: 'blue'
    },
    data: [
      {
        title: {
          id: 'a',
          name: 'atitle',
        },
        rating: 40
      }, 
      {
        title: {
          id: 'b',
          name: 'btitle',
        },
        rating: null
      },
      {
        title: {
          id: 'c',
          name: 'ctitle',
        },
        rating: 10
      }
    ]
  }
]

我尝试过使用 map 和 reduce 进行这种转换,但我被卡住了。有没有一种简单的方法可以做到这一点?

最佳答案

给你。

简要逻辑:从数据数组的第 0 个索引处获取对象的所有键。遍历键,如果键包含'_',选择键,将其分解以形成 id 和 name 对,然后映射所有数据对象,获取该键的分数并将其附加到具有 id 和 name 值的对象.最后将此对象附加到结果数组。对所有包含“_”的键执行此操作。

const data = [ 
  { 
    titleId: 'a',
    titleName: 'atitle',
    '1af_red': 50,
    'ba2_blue': 40
  },
  {
    titleId: 'b',
    titleName: 'btitle',
    '1af_red': 30,
    'ba2_blue': null
  },
  {
    titleId: 'c',
    titleName: 'ctitle',
    '1af_red': null,
    'ba2_blue': 10
  }
];
const keys = Object.keys(data[0]);
const result = []
keys.map(key=> {
  if(key.indexOf('_')!==-1){
    const item = {}
    const keyData = key.split('_')
    item.color = {
      id : keyData[0],
      name : keyData[1]
    }
    item.data = []
    data.map(obj => {
      const newObj = {}
      newObj.title = {
        id : obj.titleId,
          name : obj.titleName
      }
      newObj.rating = obj[key];
      item.data.push(newObj);
    });
  result.push(item);
  }
});
console.log(result);

关于javascript - 在 Javascript 中转换对象格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54709262/

相关文章:

javascript - ES6 导出覆盖函数

javascript - HTML 中表单标签和 anchor 标签之间的接口(interface)

javascript - 如何获得无限滚动,直到所有结果都显示在React中的Elasticsearch JS API中

ios - 如何在 Storyboard中的多个 View 之间传递对象,iOS Dev

javascript - 存储 JS 对象以及原型(prototype)、实例类型等

c++ - C++中对象和变量的区别

javascript - 如何在循环内检查 for 循环何时完成?

javascript - JS 'onclick' 处理程序阻止 ':hover' CSS

Java - 与对象分配混淆

javascript - JavaScript 中的嵌套对象,最佳实践