代码之家  ›  专栏  ›  技术社区  ›  Isaac

无法确定如何正确断言对象

  •  2
  • Isaac  · 技术社区  · 6 年前

    let records = {
      2018: {
        Jan: {
          records: [{ 
            id: 123, 
            date: '01-Jan-2018', 
            amount: 300,
            type: 'expense'
           }],
          totalExpenses: 300,
          totalIncome: 0
        },
        Feb: {
          records: [{ 
            id: 234, 
            date: '01-Jan-2019', 
            description: 'Syabas', 
            amount: 100,
            type: 'income'
           }],
          totalExpenses: 0,
          totalIncome: 100
        }
      },
      2019: {
        Jan: {
          records: [{ 
            id: 789, 
            date: '01-Jan-2019', 
            description: 'McD', 
            amount: 150,
            type: 'expense'
           }],
          totalExpenses: 150,
          totalIncome: 0
        },
      }
    }
    let year = 2018;
    let month = 'Jan';
    
    const yearRecords = records[year] || { [year]: {} };
    const monthRecords = yearRecords[month] || { [month]: {} };
    const recordList = monthRecords['records'] || [];
    
    const newRec = {id: 666, amount: 9999};
    const newRecordList = [...recordList, newRec];
    monthRecords['records'] = newRecordList;
    monthRecords.totalExpenses = newRecordList.reduce((accumulator, record) => {
      return accumulator + record.amount;
    }, 0);
    
    
    console.log({...records, [year]: yearRecords})

    records ,我正在尝试附加新记录 newRec 记录 .

    排列并增加 totalExpenses 现场。

    year/month 存在于 记录 但如果我设定的话 let year = 2020

    当年份=2020年时,下面将显示错误的结果

    let records = {
          2018: {
            Jan: {
              records: [{ 
                id: 123, 
                date: '01-Jan-2018', 
                amount: 300,
                type: 'expense'
               }],
              totalExpenses: 300,
              totalIncome: 0
            },
            Feb: {
              records: [{ 
                id: 234, 
                date: '01-Jan-2019', 
                description: 'Syabas', 
                amount: 100,
                type: 'income'
               }],
              totalExpenses: 0,
              totalIncome: 100
            }
          },
          2019: {
            Jan: {
              records: [{ 
                id: 789, 
                date: '01-Jan-2019', 
                description: 'McD', 
                amount: 150,
                type: 'expense'
               }],
              totalExpenses: 150,
              totalIncome: 0
            },
          }
        }
        let year = 2020;
        let month = 'Jan';
    
        const yearRecords = records[year] || { [year]: {} };
        const monthRecords = yearRecords[month] || { [month]: {} };
        const recordList = monthRecords['records'] || [];
    
        const newRec = {id: 666, amount: 9999};
        const newRecordList = [...recordList, newRec];
        monthRecords['records'] = newRecordList;
        monthRecords.totalExpenses = newRecordList.reduce((accumulator, record) => {
          return accumulator + record.amount;
        }, 0);
    
    
        console.log({...records, [year]: yearRecords})
    1 回复  |  直到 6 年前
        1
  •  1
  •   Nenad Vracar    6 年前

    你可以用 reduce

    let records = {"2018":{"Jan":{"records":[{"id":123,"date":"01-Jan-2018","amount":300,"type":"expense"}],"totalExpenses":300,"totalIncome":0},"Feb":{"records":[{"id":234,"date":"01-Jan-2019","description":"Syabas","amount":100,"type":"income"}],"totalExpenses":0,"totalIncome":100}},"2019":{"Jan":{"records":[{"id":789,"date":"01-Jan-2019","description":"McD","amount":150,"type":"expense"}],"totalExpenses":150,"totalIncome":0}}}
    
    let month = 'Jan';
    
    function update(year, month, obj, target) {
      [year, month].reduce(function(r, e, i, a) {
        if(!a[i + 1] && r[e]) {
          r[e].records.push(obj);
          r[e].totalExpenses += obj.amount
        }
        return r[e] = (r[e] || (a[i + 1] ? {} : {
          records: [obj],
          totalExpenses: obj.amount,
          totalIncome: 0
        }))
      }, target)
    }
    
    update(2018, month, {id: 4, amount: 9999}, records);
    update(2020, month, {id: 5, amount: 9999}, records);
    
    console.log(records)