js怎么根据月份把两个数组对象整合为一个新的数组对象?

各位大佬,怎么才能把这两个数组整合为下面这种数组的形式?

var data = [
    {name:'离职',label:'quit'},{name:'在职',label:'on'}
];
var rows = [
    {month: 1,quit:2,on:10},
    {month: 2,quit:1,on:11},
    {month: 3,quit:3,on:9}
];
结果: [
     {name: '离职',January: 2,February: 1,March: 3},
     {name: '在职',January: 10,February: 11,March: 9}
 ];
阅读 2.3k
3 个回答
//  knew payloads
let data = [{name:'离职',label:'quit'},{name:'在职',label:'on'}]
let rows = [ {month: 1,quit:2,on:10}, {month: 2,quit:1,on:11}, {month: 3,quit:3,on:9} ]

//  static parameters
const monthList = ['January','February','March','April']
//  solution A
let res1 = data.map(ele=>{
    let temp = { name:ele.name }
    rows.forEach(item=>{
        if ( monthList[(item.month)-1] ) temp[monthList[(item.month)-1]] = item[ele.label] || 0
    })
    return temp
})
//  solution B
class counter {
    constructor({name}) {
        this.months = ['January','February','March','April']
        this.zeorParma = {}
        this.months.forEach(m=>{
            this.zeorParma[m] = 0
        })
        this.name = name
    }
    //  transfer with int
    countInt(list,label) { 
        let res = { name : this.name, ...this.zeorParma }
        list.forEach(ele=>{
            if(this.months[ele.month-1]){
                res[this.months[ele.month-1]] = ele[label] || 0
            }
        })
        return res
    }
    //  transfer with percent
    countPercent(list,label,adders){
        let res = { name : this.name, ...this.zeorParma }
        list.forEach(ele=>{
            if(this.months[ele.month-1]){
                let sum = adders.reduce((total,cur)=>total + (ele[cur] || 0) ,0)
                res[this.months[ele.month-1]] = (ele[label] / sum).toFixed(2)
            }
        })
        return res
    }
}
let res2 = data.map(ele=>{
    return new counter(ele).countInt(rows,ele.label)
})
let res3 = data.map(ele=>{
    return new counter(ele).countPercent(rows,ele.label,data.map(e=>e.label))
})
console.log(res1,res2,res3)

输出

[
  { name: '离职', January: 2, February: 1, March: 3 },
  { name: '在职', January: 10, February: 11, March: 9 }
] [
  { name: '离职', January: 2, February: 1, March: 3, April: 0 },
  { name: '在职', January: 10, February: 11, March: 9, April: 0 }
] [
  {
    name: '离职',
    January: '0.17',
    February: '0.08',
    March: '0.25',
    April: 0
  },
  {
    name: '在职',
    January: '0.83',
    February: '0.92',
    March: '0.75',
    April: 0
  }
]
console.log(data.map(v=>{
    return {
       name:v.name,
        January:rows[0][v.label],
        February:rows[1][v.label],
        March:rows[2][v.label] 
    }
}))

我来写写我的思路

const January = 'January'

const February = 'February'

const March = 'March'

const April = 'April'

const May = 'May'

const June = 'June'

  

const July = 'July'

const August = 'August'

const September = 'September'

const October = 'October'

const November = 'November'

const December = 'December'

  

const Nonuse = 'Nonuse'

  

const monthData = [Nonuse, January, February, March, April, May, April, June,

 July, August, September, October, November, December]

  

type Name = '在职' | '离职'

  

interface Result {

 name: Name

 January: number

 February: number

 March: number

 April: number

 May: number

 June: number

  

 July: number

 August: number

 September: number

 October: number

 November: number

 December: number

 [key: string]: any

}

  

const result: Result[] = [{

 name: '在职',

 January: 0,

 February: 0,

 March: 0,

 April: 0,

 May: 0,

 June: 0,

  

 July: 0,

 August: 0,

 September: 0,

 October: 0,

 November: 0,

 December: 0,

  

}, {

 name: '离职', January: 0,

 February: 0,

 March: 0,

 April: 0,

 May: 0,

 June: 0,

  

 July: 0,

 August: 0,

 September: 0,

 October: 0,

 November: 0,

 December: 0,

}]

  

interface Data {

 name: Name

 label: Label

}

  

var data: Data[] = [

 { name: '离职', label: 'quit' }, { name: '在职', label: 'on' }

]

var rows = [

 { month: 1, quit: 2, on: 10 },

 { month: 2, quit: 1, on: 11 },

 { month: 3, quit: 3, on: 9 }

]

  

type Label = 'on' | 'quit'

  

function findName(label: Label): Name {

 return data.reduce((name, curData) => curData.label === label ? curData.name : name, data[0].name)

}

  

function findResult(label: Label): Result {

 return result.reduce((result, cur) => cur.name === findName(label) ? cur : result, result[0])

}


rows.forEach(row => {

 if (row.on > 0) {

 findResult('on')[monthData[row.month]] += row.on

 }

 if (row.quit > 0) {

 findResult('quit')[monthData[row.month]] += row.quit

 }

})

console.log(result)

下面是js的代码

"use strict";

const January = 'January';

const February = 'February';

const March = 'March';

const April = 'April';

const May = 'May';

const June = 'June';

const July = 'July';

const August = 'August';

const September = 'September';

const October = 'October';

const November = 'November';

const December = 'December';

const Nonuse = 'Nonuse';

const monthData = [Nonuse, January, February, March, April, May, April, June,

 July, August, September, October, November, December];

const result = [{

 name: '在职',

 January: 0,

 February: 0,

 March: 0,

 April: 0,

 May: 0,

 June: 0,

 July: 0,

 August: 0,

 September: 0,

 October: 0,

 November: 0,

 December: 0,

 }, {

 name: '离职', January: 0,

 February: 0,

 March: 0,

 April: 0,

 May: 0,

 June: 0,

 July: 0,

 August: 0,

 September: 0,

 October: 0,

 November: 0,

 December: 0,

 }];

var data = [

 { name: '离职', label: 'quit' }, { name: '在职', label: 'on' }

];

var rows = [

 { month: 1, quit: 2, on: 10 },

 { month: 2, quit: 1, on: 11 },

 { month: 3, quit: 3, on: 9 }

];

function findName(label) {

 return data.reduce((name, curData) => curData.label === label ? curData.name : name, data[0].name);

}

function findResult(label) {

 return result.reduce((result, cur) => cur.name === findName(label) ? cur : result, result[0]);

}


rows.forEach(row => {

 if (row.on > 0) {

 findResult('on')[monthData[row.month]] += row.on;

 }

 if (row.quit > 0) {

 findResult('quit')[monthData[row.month]] += row.quit;

 }

});

console.log(result);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题