JavaScript 一維數組轉二維數組


問題描述:

有如下結構的一維數組:

const list = [ {grade: '小學', city: '北京', count: 18}, {grade: '小學', city: '上海', count: 12}, {grade: '小學', city: '杭州', count: 19}, {grade: '小學', city: '深圳', count: 10}, {grade: '初中', city: '北京', count: 18}, {grade: '初中', city: '上海', count: 12}, {grade: '初中', city: '杭州', count: 19}, {grade: '初中', city: '深圳', count: 10}, {grade: '高中', city: '北京', count: 18}, {grade: '高中', city: '上海', count: 12}, {grade: '高中', city: '杭州', count: 19}, {grade: '高中', city: '深圳', count: 10}, {grade: '大學', city: '北京', count: 18}, {grade: '大學', city: '上海', count: 12}, {grade: '大學', city: '杭州', count: 19}, {grade: '大學', city: '深圳', count: 10}, ]

需要處理為二維數組,其中第一維是 grade,第二維是 city:

cosnt res = [ { name: "小學", value: [ {name: "北京", value: 18} {name: "上海", value: 12} {name: "杭州", value: 19} {name: "深圳", value: 10} ] } { name: "初中", value: [ {name: "北京", value: 18} {name: "上海", value: 12} {name: "杭州", value: 19} {name: "深圳", value: 10} ] } { name: "高中", value: [ {name: "北京", value: 18} {name: "上海", value: 12} {name: "杭州", value: 19} {name: "深圳", value: 10} ] } { name: "大學", value: [ {name: "北京", value: 18} {name: "上海", value: 12} {name: "杭州", value: 19} {name: "深圳", value: 10} ] } ]

 

解決方案:

/**
 * 將一維數組處理為二維數組
 * @param {Array} list 需要處理的一維數組
 * @param {Object} extra 包含 nameKey 和 valueKey
 * @param {Array} nameKey 長度為二的數組,依序為 name 取值
 * @param {String} valueKey value 取值的鍵
 * @returns 
 */
function convertOneDimArray(list, extra) {
  const { nameKey, valueKey } = extra || {};

  if (!nameKey || nameKey.length < 2 || !Array.isArray(list)) {
    return null;
  }

  const [name1, name2] = nameKey;
  const xMap = new Map();

  list.forEach((item) => {
    const x = item[name1];
    const y = {
      name: item[name2],
      value: item[valueKey],
    }
    const xValue = xMap.get(x);
    if (!xValue) {
      xMap.set(x, {
        name: x,
        value: [y],
      });
    } else {
      xValue.value.push(y)
    }
  });

  return [...xMap.values()];
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM