【问题标题】:Refactor double for loop in Javascript在 Javascript 中重构 double for 循环
【发布时间】:2020-11-20 13:18:46
【问题描述】:

在这种情况下是否可以将 for 循环的数量减少到只有一个?我需要根据“等级”属性对对象进行分组,无论输出的数据类型如何,即使您的解决方案迫使我重新开始也没关系。我现在对算法了解不多,所以我需要你的帮助来改进我的代码,因为我不允许在单个代码块中使用多个 for 循环。

var schools = {
    'SCHOOL_1':
    [
        // girls
        {id: '1', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'},
        {id: '2', school: 'SCHOOL_1', grade: 'A', message: 'Good work!'},
        {id: '3', school: 'SCHOOL_1', grade: 'A', message: 'Ok'},
        // boys
        {id: '4', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'},
        {id: '5', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'},
        {id: '6', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'},
        {id: '7', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'},
        {id: '8', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'},

    ],
    'SCHOOL_2':
    [
        // girls
        {id: '9', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
        {id: '10', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
        {id: '11', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
        {id: '12', school: 'SCHOOL_2', grade: 'B', message: 'Good work!'},
        {id: '13', school: 'SCHOOL_2', grade: 'B', message: 'Nice!'},
        // boys
        {id: '14', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
        {id: '15', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
        {id: '16', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
        {id: '17', school: 'SCHOOL_2', grade: 'B', message: 'Congratulations!'},
    ]
}

var result = [];

for (let school in schools) {
    // Group students by grade
    let studentsByGrade = GroupByProperty(schools[school], 'grade');
    // Second loop (I NEED TE REFACTOR THIS)
    for (let grade in studentsByGrade) {
        if (!result[grade]) result[grade] = [];
        result[grade].push(studentsByGrade[grade]);
    }
}

console.log('result',result);

function GroupByProperty(objectArray, property) {
    let result = objectArray.reduce((acc, obj) => {
       var key = obj[property];
       if (!acc[key]) acc[key] = [];
       acc[key].push(obj);
       return acc;
    }, {});

    return result;
}

【问题讨论】:

  • Object.values(schools).flat()
  • @Keith:秒杀我。
  • @ScottSauyet 是的,但你的答案得到了 cookie,.. 赞成..!

标签: javascript arrays loops object


【解决方案1】:

通过组合Object.valuesArray.prototype.flat,您可以将此对象变成一个对象列表。

这样就可以了:

function GroupByProperty(objectArray, property) {
    let result = objectArray.reduce((acc, obj) => {
       var key = obj[property];
       if (!acc[key]) acc[key] = [];
       acc[key].push(obj);
       return acc;
    }, {});

    return result;
}

const byGrades = (schools) => 
  GroupByProperty (Object .values (schools) .flat(), 'grade')

var schools = {'SCHOOL_1': [{id: '1', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'}, {id: '2', school: 'SCHOOL_1', grade: 'A', message: 'Good work!'}, {id: '3', school: 'SCHOOL_1', grade: 'A', message: 'Ok'}, {id: '4', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'}, {id: '5', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'}, {id: '6', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'}, {id: '7', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'}, {id: '8', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'}], 'SCHOOL_2': [{id: '9', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'}, {id: '10', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'}, {id: '11', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'}, {id: '12', school: 'SCHOOL_2', grade: 'B', message: 'Good work!'}, {id: '13', school: 'SCHOOL_2', grade: 'B', message: 'Nice!'}, {id: '14', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'}, {id: '15', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'}, {id: '16', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'}, {id: '17', school: 'SCHOOL_2', grade: 'B', message: 'Congratulations!'}]}

console .log (byGrades (schools))

【讨论】:

    【解决方案2】:

    使用Object.values() flat()reduce() 的紧凑型解决方案,使用destructuring 实现并利用nullish coalescing operator

    const bygrade = Object.values(schools)
       .flat()
       .reduce((acc, o) => 
          (acc[o.grade] = [...acc[o.grade] ?? [], {...o}], acc), {});
    

    var schools = {
        'SCHOOL_1':
        [
            // girls
            {id: '1', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'},
            {id: '2', school: 'SCHOOL_1', grade: 'A', message: 'Good work!'},
            {id: '3', school: 'SCHOOL_1', grade: 'A', message: 'Ok'},
            // boys
            {id: '4', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'},
            {id: '5', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'},
            {id: '6', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'},
            {id: '7', school: 'SCHOOL_1', grade: 'A', message: 'Congratulations!'},
            {id: '8', school: 'SCHOOL_1', grade: 'B', message: 'Good work!'},
    
        ],
        'SCHOOL_2':
        [
            // girls
            {id: '9', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
            {id: '10', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
            {id: '11', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
            {id: '12', school: 'SCHOOL_2', grade: 'B', message: 'Good work!'},
            {id: '13', school: 'SCHOOL_2', grade: 'B', message: 'Nice!'},
            // boys
            {id: '14', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
            {id: '15', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
            {id: '16', school: 'SCHOOL_2', grade: 'A', message: 'Congratulations!'},
            {id: '17', school: 'SCHOOL_2', grade: 'B', message: 'Congratulations!'},
        ]
    }
    
    const bygrade = Object.values(schools).flat().reduce((acc, o) => (acc[o.grade] = [...acc[o.grade] ?? [], {...o}], acc), {});
    
    console.log(bygrade);

    【讨论】:

    • 是的,尽管 OP 在问题 (GroupByProperty) 中已经有一个更通用的等价于您的 reduce 调用。
    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 2018-07-04
    • 2020-01-04
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多