【问题标题】:Sorting names into a specific order?将名称按特定顺序排序?
【发布时间】:2021-02-04 22:21:19
【问题描述】:

我有这个学生成绩数据对象,看起来像这样

data = {
 9: {
  Math: {
   className: {
     grade: 'A'
   }
   className2: {
     grade: 'A'
   }
  }
  History: {
   className: {
     grade: 'A'
   }
   className2: {
     grade: 'A'
   }
  }
  English: {
   className: {
     grade: 'A'
   }
   className2: {
     grade: 'A'
   }
  }
 }
}

从 9 点到 12 点。

我想知道是否可以按特定顺序对数学/历史/英语部分进行排序,就像我要先英语然后数学然后历史一样。

谢谢

【问题讨论】:

标签: javascript sorting object


【解决方案1】:

您的数据结构看起来并不是最适合您想要实现的目标,但是是的 - 如果您愿意,您可以订购对象。从 ES2015 开始,对象键的顺序被授予,因此将这些学校科目按所需顺序排列是有道理的。

尝试Array.prototype.reduce 以达到所需的顺序:

const subjects = ['English', 'Math', 'History'];

const orderedData = Object.entries(data).reduce((result, [n, nData]) => ({
    ...result,
    [n]: subjects.reduce((entry, subject) => ({
        ...entry,
        [subject]: nData[subject]
    }), {})
}), {});

// orderedData now contains new object in desired order

【讨论】:

    【解决方案2】:

    正如 Bergi 已经指出的那样,必须将每个 类级别的值从现在的对象结构重构为 主题(相关)数据的数组 .. .

    const sampleData = {
      9: {
        Math: {
          className: { grade: 'A' },
          className2: { grade: 'A' }
        },
        History: {
          className: { grade: 'A' },
          className2: { grade: 'A' }
        },
        English: {
          className: { grade: 'A' },
          className2: { grade: 'A' }
        }
      },
      10: {
        Math: { className: { grade: 'A' } },
        History: { className: { grade: 'A' } },
        English: { className: { grade: 'A' } }
      }
    };
    const subjectPrecedence = new Map(
      ['English', 'Math', 'History'].map((subject, idx) => [subject, idx])
    );  
    
    function compareEntryKeysViaBoundPrecedenceMap(entryA, entryB) {
      return (this.get(entryA[0]) - this.get(entryB[0]));
    }
    
    function restructureClassEntry(collector, classEntry) {
      const { data, compareSubjectEntries } = collector;
      const [ classLevel, levelData ] = classEntry;
    
      data[classLevel] = Object
        .entries(levelData)
        .sort(compareSubjectEntries)
        .map(entry => Object.fromEntries([entry]));
    
      return collector;
    }
    
    const orderedClassData = Object
      .entries(sampleData)
      .reduce(restructureClassEntry, {
    
        compareSubjectEntries: compareEntryKeysViaBoundPrecedenceMap.bind(subjectPrecedence),
        data: {}
    
      }).data;
    
    console.log('[...subjectPrecedence.entries()] :', [...subjectPrecedence.entries()]);
    console.log('orderedClassData :', orderedClassData);
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多