js 数组快速 重建成理想数据结构

亲,请教一个问题?


[
    {
      "name": "商户1",
      "list": [
        {
          "chargeOffAmounts": 12,
          "writeOffDate": "2023-02-27"
        },
        {
          "chargeOffAmounts": 2,
          "writeOffDate": "2023-03-06"
        }
      ]
    },
    {
      "name": "商户2",
      "list": [
        {
          "chargeOffAmounts": 1,
          "writeOffDate": "2023-03-05"
        }
      ]
    }
  ]

[
    {
      "name": "商户1",
      "list": [
        {
          "chargeOffAmounts": 12,
          "writeOffDate": "2023-02-27"
        },
        {
          "chargeOffAmounts": 0,
          "writeOffDate": "2023-03-05"
        },
        {
          "chargeOffAmounts": 2,
          "writeOffDate": "2023-03-06"
        }
      ]
    },
    {
      "name": "商户2",
      "list": [
      {
          "chargeOffAmounts": 0,
          "writeOffDate": "2023-02-27"
        },
        {
          "chargeOffAmounts": 1,
          "writeOffDate": "2023-03-05"
        },
        {
          "chargeOffAmounts": 0,
          "writeOffDate": "2023-03-06"
        }
      ]
    }
  ]

怎么把上面的结构改成下面的。

该答案引用 chatgpt @瞬间的未来式

<script type="text/javascript">
let arr = [
  {
    "name": "商户1",
    "list": [
      {
        "chargeOffAmounts": 12,
        "writeOffDate": "2023-02-27"
      },
      {
        "chargeOffAmounts": 2,
        "writeOffDate": "2023-03-06"
      }
    ]
  },
  {
    "name": "商户2",
    "list": [
      {
        "chargeOffAmounts": 1,
        "writeOffDate": "2023-03-05"
      }
    ]
  }
];

// 获取所有日期列表
let dateList = Array.from(new Set(arr.flatMap(item => item.list.map(entry => entry.writeOffDate)))).sort();

// 补全日期和chargeOffAmounts字段
let newArr = arr.map(item => {
  let newList = [];
  dateList.forEach(date => {
    let entry = item.list.find(obj => obj.writeOffDate === date);
    if (entry) {
      newList.push(entry);
    } else {
      newList.push({
        chargeOffAmounts: 0,
        writeOffDate: date
      });
    }
  });
  return {
    name: item.name,
    list: newList
  };
});

console.log(newArr);
</script>

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7711158
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:js 数据结构中邻接矩阵的图的直观表示
  • 除此之外, 这篇博客: js数据结构——数组中的 将一个类数组对象或者可遍历对象转换成一个真正的数组。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 要将一个类数组对象转换为一个真正的数组,必须具备以下条件:

    1. 该类数组对象必须具有length属性,用于指定数组的长度。如果没有length属性,那么转换后的数组是一个空数组。
    2. 该类数组对象的属性名必须为数值型或字符串型的数字
    let arrayLike = {
        0: 'tom', 
        1: '65',
        2: '男',
        3: ['jane','john','Mary'],
        'length': 4
    }
    let arr = Array.from(arrayLike)
    console.log(arr) // ['tom','65','男',['jane','john','Mary']]
    
  • 您还可以看一下 黄菊华老师的JavaScript基础入门到精通(网站开发就业技能)课程中的 微信小程序入门到就业课(全栈课)学习说明【建议看下】小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对这个问题,可以使用 map() 方法对数组进行转换,具体步骤如下:

    1. 定义要转换成的数据结构的模板:比如想将数组转换成对象,那么可以定义如下模板:
    const objTemplate = {
      id: null,
      name: '',
      age: 0,
      score: 0
    };
    
    1. 使用 map() 方法遍历数组,在每个元素上应用模板进行转换:
    const newArray = oldArray.map((item) => {
      const newObj = {...objTemplate, ...item};
      return newObj;
    });
    
    1. 解释一下这个过程:

    首先,定义了一个对象模板 objTemplate,其中每个属性的初始值用于表示数据的类型。

    然后,使用 map() 方法遍历 oldArray,对每个元素应用模板进行转换。模板中的属性名必须和数组元素中的属性名一一对应。可以使用 ES6 的展开语法和对象合并语法({...obj1, ...obj2})来实现将模板中的属性和元素中的属性合并到一个新的对象中。

    最后,将新的对象添加到一个新的数组中,该数组通过 map() 方法返回。

    下面是完整的代码示例,为了方便测试,生成了一个随机数组作为原始数据:

    // 生成一个随机数组作为原始数据
    const oldArray = Array.from({length: 5}, () => ({
      id: Math.floor(Math.random() * 100),
      name: 'name' + Math.floor(Math.random() * 100),
      age: Math.floor(Math.random() * 10) + 20,
      score: Math.floor(Math.random() * 60) + 40
    }));
    
    console.log('原始数组:', oldArray);
    
    // 定义要转换成的数据结构的模板
    const objTemplate = {
      id: null,
      name: '',
      age: 0,
      score: 0
    };
    
    // 遍历数组,将每个元素转换成一个新对象,并存放到新数组中
    const newArray = oldArray.map((item) => {
      const newObj = {...objTemplate, ...item};
      return newObj;
    });
    
    console.log('转换后的数组:', newArray);
    

    运行代码后,可以看到输出结果:

    原始数组: 
    [ { id: 51, name: 'name73', age: 22, score: 54 },
      { id: 91, name: 'name91', age: 27, score: 45 },
      { id: 51, name: 'name52', age: 21, score: 94 },
      { id: 0, name: 'name33', age: 25, score: 91 },
      { id: 27, name: 'name1', age: 23, score: 61 } ]
    转换后的数组: 
    [ { id: 51, name: 'name73', age: 22, score: 54 },
      { id: 91, name: 'name91', age: 27, score: 45 },
      { id: 51, name: 'name52', age: 21, score: 94 },
      { id: 0, name: 'name33', age: 25, score: 91 },
      { id: 27, name: 'name1', age: 23, score: 61 } ]
    

    从输出结果可以看出,原始数组和转换后的数组是一致的,表明转换成功。