>source

총 3 개의 합계를 추가하려고합니다 : totalPoints monthlyTotalsmonthlyByType   Array.prototype.reduce 사용 .

totalPointsmonthlyTotals  잘 작동하지만 마지막에 붙어있어 monthlyByType .

반복해야 할 배열은 다음과 같습니다.

const gamePointsArray = [
  {
    gamePlayId: 'ggg1',
    gameType: 1,
    gameMonth: 4,
    gamePoints: 4000,
  },
  {
    gamePlayId: 'ggg2',
    gameType: 2,
    gameMonth: 2,
    gamePoints: 7000,
  },
  {
    gamePlayId: 'ggg3',
    gameType: 2,
    gameMonth: 0,
    gamePoints: 3000,
  },
  {
    gamePlayId: 'ggg4',
    gameType: 1,
    gameMonth: 8,
    gamePoints: 25000,
  },
  {
    gamePlayId: 'ggg5',
    gameType: 3,
    gameMonth: 8,
    gamePoints: 5000,
  },
  {
    gamePlayId: 'ggg6',
    gameType: 3,
    gameMonth: 3,
    gamePoints: 10000,
  },
  {
    gamePlayId: 'ggg7',
    gameType: 2,
    gameMonth: 3,
    gamePoints: 5000,
  },
]

여기 내 감속기의

const gamePointsReducer = (acc, game) => {
  const { gamePlayId, gameType, gameMonth, gamePoints,} = game
  if (!acc['totalPoints']) {
    acc['totalPoints'] = gamePoints
  } else {
    acc['totalPoints'] += gamePoints
  }
  if (!acc['monthlyTotals']) {
    acc['monthlyTotals'] = {
      0: 0,
      1: 0,
      2: 0,
      3: 0,
      4: 0,
      5: 0,
      6: 0,
      7: 0,
      8: 0,
      9: 0,
      10: 0,
      11: 0,
    }
  }
  acc.monthlyTotals[`${gameMonth}`] += gamePoints 
  if (!acc['monthByType']) {
    acc['monthByType'] = {
      0: {},
      1: {},
      2: {},
      3: {},
      4: {},
      5: {},
      6: {},
      7: {},
      8: {},
      9: {},
      10: {},
      11: {},
    }
  }
  acc.monthByType[`${gameMonth}`] += {
    [`${gameType}`]: gamePoints
  }
  return acc

}

const monthTotalsObj = gamePointsArray.reduce(gamePointsReducer, {}) 
console.log('Game Points totals obj', monthTotalsObj);

최종 결과 Object 가 필요합니다  다음과 같이 보일 것입니다 :

{
  totalPoints: 59000,
  monthlyTotals: {
    0: 3000,
    1: 0,
    2: 7000,
    3: 15000,
    4: 4000,
    5: 0,
    6: 0,
    7: 0,
    8: 30000,
    9: 0,
    10: 0,
    11: 0,
  },
  monthByType: {
    0: {
      2: 3000,
    },
    1: {},
    2: {
      2: 7000,
    },
    3: {},
    4: {
      1: 4000,
    },
    5: {},
    6: {},
    7: {},
    8: {
      1: 25000,
      3: 5000,
    },
    9: {},
    10: {},
    11: {},
  }
}


  • 답변 # 1

    기본 intialValue 를 만들 수 있습니다  목적. 이것은 당신이 if 를 피하는 데 도움이 될 것입니다  콜백 감소 전반에 걸쳐 확인합니다.

    그런 다음 reduce  콜백은 이미하고있는 것과 비슷합니다. 각 monthByType 를 업데이트하십시오.

    const gamePointsArray=[{gamePlayId:"ggg1",gameType:1,gameMonth:4,gamePoints:4000,},{gamePlayId:"ggg2",gameType:2,gameMonth:2,gamePoints:7000,},{gamePlayId:"ggg3",gameType:2,gameMonth:0,gamePoints:3000,},{gamePlayId:"ggg4",gameType:1,gameMonth:8,gamePoints:25000,},{gamePlayId:"ggg5",gameType:3,gameMonth:8,gamePoints:5000,},{gamePlayId:"ggg6",gameType:3,gameMonth:3,gamePoints:10000,},{gamePlayId:"ggg7",gameType:2,gameMonth:3,gamePoints:5000,}];
    const initialValue = { 
      totalPoints: 0,
      monthlyTotals: { ...Array(12).fill(0) },
      monthByType: { ... Array.from({ length: 12 }, _ => ({})) }
    }
    const output = gamePointsArray.reduce((acc, o) => {
      acc.totalPoints += o.gamePoints;
      acc.monthlyTotals[o.gameMonth] += o.gamePoints;
      acc.monthByType[o.gameMonth][o.gameType] = 
          (acc.monthByType[o.gameMonth][o.gameType] || 0) + o.gamePoints;
      return acc;
    }, initialValue)
    console.log(output)
    
    

    initialValue 에 대한 추가 설명이 있습니다.  개체 :

    와이즈 비즈  속성은 monthlyTotals 를 사용하여 생성됩니다   또는 { ...Array(12).fill(0) } . 그러면 배열의 인덱스를 키로, 값을 키 값으로 사용하는 객체가 생성됩니다

    Object.assign({}, Array(12).fill(0) )  객체 리터럴로 채워야합니다. monthByType 를 사용할 수 있습니다  이를 위해. ( Array.from() 를 사용할 수 없습니다  위와 같이. 바람직하지 않은 모든 인덱스에서 동일한 정적 객체의 참조를 사용합니다)

    fill
    
    

  • 답변 # 2

    대신 객체의 prefilld 배열을 가지고 할당하거나 값을 추가 할 수 있습니다.

    const arrayWithZeros = Array(12).fill(0),
          monthlyTotals = { ...arrayWithZeros };
    const arrayWithEmptyLiterals = Array.from({ length: 12 }, _ => ({}) ),
          monthByType = { ...arrayWithEmptyLiterals }
    console.log(JSON.stringify(arrayWithZeros))
    console.log(JSON.stringify(monthlyTotals))
    console.log(JSON.stringify(arrayWithEmptyLiterals))
    console.log(JSON.stringify(monthByType))
    
    
    const getYear = fn => Array.from({ length: 12 }, fn);
    var data = [{ gamePlayId: 'ggg1', gameType: 1, gameMonth: 4, gamePoints: 4000 }, { gamePlayId: 'ggg2', gameType: 2, gameMonth: 2, gamePoints: 7000 }, { gamePlayId: 'ggg3', gameType: 2, gameMonth: 0, gamePoints: 3000 }, { gamePlayId: 'ggg4', gameType: 1, gameMonth: 8, gamePoints: 25000 }, { gamePlayId: 'ggg5', gameType: 3, gameMonth: 8, gamePoints: 5000 }, { gamePlayId: 'ggg6', gameType: 3, gameMonth: 3, gamePoints: 10000 }, { gamePlayId: 'ggg7', gameType: 2, gameMonth: 3, gamePoints: 5000 }],
        result = data.reduce((r, { gameType, gameMonth, gamePoints }) => {
            r.total += gamePoints;
            r.monthlyTotals[gameMonth] += gamePoints;
            r.monthByType[gameMonth][gameType] = (r.monthByType[gameMonth][gameType] || 0) + gamePoints;
            return r;
        }, { total: 0, monthlyTotals: getYear(() => 0), monthByType: getYear(() => ({ })) });
    console.log(result);
    
    

    .as-console-wrapper { max-height: 100% !important; top: 0; }

  • 이전 Visual Studio 2019를 사용하여 ASPNET Core 22에서 Font Awesome을 설치하는 방법
  • 다음 reactjs - componentDidMount에서 상태가있는 동적 URL을 생성하는 방법은 무엇입니까?