# Bài toán kinh điển sử dụng three dots lấy tất cả các key của object, key same, plus (ok)

**Ví dụ 1: Lấy tất cả các key của object (ok)**

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script type="text/javascript">
  var test = [{
    key1: 1,
    key2: 2
  }, {
    key2: 2,
    key3: 3,
    key6: 5
  }, {
    key3: 3,
    key4: 4
  }, {
    key4: 4,
    key5: 5
  }];
	// console.log(Object.getOwnPropertyNames(testkey));
	var result = test.reduce(function(sum,now){
		return {...sum,...now};
	},{});
	console.log(result);
  </script>
</body>
</html>
```

![](/files/95rzojj43baAm0kEySXX)

**Ví dụ 2: Mở rộng ví dụ tính tổng các key trùng nhau (P1)**

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script type="text/javascript">
  var test = [{
    key1: 1,
    key2: 2
  }, {
    key2: 2,
    key3: 3,
    key6: 5
  }, {
    key3: 3,
    key4: 4
  }, {
  	key1: 100,
    key4: 4,
    key5: 5
  }];
	var result = test.reduce(function(sum,now){
		return {...sum,...now};
	},{});
	var arrs = Object.keys(result);
	var tong1,tong2,tong3,tong4,tong5,tong6;
	tong1 = tong2 = tong3 = tong4 = tong5 = tong6 = 0;
	var total = test.reduce(function(sum,now){
		if(now.hasOwnProperty(arrs[0])) {
			tong1 += now[arrs[0]];
		}
		if(now.hasOwnProperty(arrs[1])) {
			tong2 += now[arrs[1]];
		}
		if(now.hasOwnProperty(arrs[2])) {
			tong3 += now[arrs[2]];
		}
		if(now.hasOwnProperty(arrs[3])) {
			tong4 += now[arrs[3]];
		}
		if(now.hasOwnProperty(arrs[4])) {
			tong5 += now[arrs[4]];
		}
		if(now.hasOwnProperty(arrs[5])) {
			tong6 += now[arrs[5]];
		}
		return {tong1: tong1,tong2: tong2,tong3: tong3,tong4: tong4,tong5: tong5,tong6: tong6}
	},0);
	console.log(total);
  </script>
</body>
</html>
```

**Ví dụ 2: Mở rộng ví dụ tính tổng các key trùng nhau (P2)**

```
var obj = [
    { 'name': 'P1', 'value': 150 },
    { 'name': 'P1', 'value': 150 },
    { 'name': 'P2', 'value': 200 },
    { 'name': 'P3', 'value': 450 },
    { 'name': 'P1', 'value': 300 }
];
var holder = {};
obj.forEach(function(d) {
  if (holder.hasOwnProperty(d.name)) {
    holder[d.name] = holder[d.name] + d.value;
  } else {
    holder[d.name] = d.value;
  }
});
var obj2 = [];
for (var prop in holder) {
  obj2.push({ name: prop, value: holder[prop] });
}
console.log(obj2);
```

![](/files/vtKORsVRoDmsKAOn4DyK)

**Ví dụ 2:  Tổng 2 khóa đối tượng giống nhau**

[**https://stackoverflow.com/questions/42488048/how-can-i-sum-properties-from-two-objects**](https://stackoverflow.com/questions/42488048/how-can-i-sum-properties-from-two-objects)

```
var obj1 = {
  a: 12,
  b: 8,
  c: 17
};

var obj2 = {
  a: 12,
  b: 8,
  c: 17
};

var obj3 = {
  a: 12,
  b: 8,
  c: 17
};


function sumObjectsByKey(...objs) {
  return objs.reduce((a, b) => {
    for (let k in b) {
      if (b.hasOwnProperty(k))
        a[k] = (a[k] || 0) + b[k];
    }
    return a;
  }, {});
}

console.log(sumObjectsByKey(obj1, obj2, obj3));
```

Bài toán 2:

```
var data = [
	{
		"id": 1,
		"name": "A1",
		"day": "mon",
		"candidate": 5
	},
	{
		"id": 2,
		"name": "A2",
		"day": "mon",
		"candidate": 2
	},
	{
		"id": 3,
		"name": "A3",
		"day": "mon",
		"candidate": 9
	},
	{
		"id": 4,
		"name": "B1",
		"day": "tue",
		"candidate": 5
	}
];
// var result = {
// 	monday: [
// 		{ "id": 1, "name": "A1", "day": "mon", "candidate": 5 }, 
// 		{ "id": 2, "name": "A2", "day": "mon", "candidate": 2 }, 
// 		{ "id": 3, "name": "A3", "day": "mon", "candidate": 9 }
// 	],
// 	tuesday: [
// 		{ "id": 4, "name": "B1", "day": "tue", "candidate": 5 }
// 	]
// }

// ===
const days = [
 {
   "id": 1,
    "name": "A",
    "day": "mon",
    "candidate": 5
  },
  {
    "id": 2,
    "name": "A",
    "day": "mon",
    "candidate": 4
   },
   {
    "id": 3,
    "name": "A",
    "day": "mon",
    "candidate": 3
  },
  {
    "id": 4,
    "name": "A",
    "day": "tue",
    "candidate": 2
  }
]

function getTH(dayString) {
	switch(dayString) {
  case "mon": return "Monday";
  case "tue": return "Tuesday";
  case "wed": return "Wednesday";
  case "thu": return "Thursday";
  case "fri": return "Friday";
  case "sat": return "Saturday";
  case "sun": return "Sunday";
  }
}

let newDaysFormatObject = {
	Monday: [],
  Tuesday: [],
  Wednesday: [],
  Thursday: [],
  Friday: [],
  Saturday: [],
  Sunday: []
};
days.forEach(d => {
	const dayTH = getTH(d.day);
  const {day, name, candidate} = d;
  newDaysFormatObject[dayTH] = [...newDaysFormatObject[dayTH], {day, name, candidate}]
});
// console.log(newDaysFormatObject);
// ===
function groupByKey(array,key) {
	return array.reduce((hask,obj)=>{
		if(obj[key] === undefined) return hask;
		return Object.assign(hask, {
			[obj[key]] : (hask[obj[key]] || []).concat(obj)
		},{});
	});
}
const cars = [
 {
   "id": 1,
    "name": "A",
    "day": "mon",
    "candidate": 5
  },
  {
    "id": 2,
    "name": "A",
    "day": "mon",
    "candidate": 4
   },
   {
    "id": 3,
    "name": "A",
    "day": "mon",
    "candidate": 3
  },
  {
    "id": 4,
    "name": "A",
    "day": "tue",
    "candidate": 2
  }
];
console.log(groupByKey(cars,"day"));
```

![](/files/nLJXcrzyWTCsC4hsexbO)

![](/files/syj3oXjmOruCXIZerz3P)

Bài toán

```javascript
"personas": [
      {
        "category":"Persona1",
        "month":"6",
        "week":"24",
        "day":"18",
        "dayaverage":0.5,
        "weekaverage":1.33333333333333,
        "monthaverage":1.53571428571429
      },
      {
        "category":"Persona2",
        "month":"6",
        "week":"24",
        "day":"18",
        "dayaverage":0.146477031224456,
        "weekaverage":0.194758246723904,
        "monthaverage":0.601273296708939
      },
      {
        "category":"Persona3",
        "month":"6",
        "week":"24",
        "day":"18",
        "dayaverage":1.25559947299078,
        "weekaverage":1.43618513323983,
        "monthaverage":0.998426393184655
      },
      {
        "category":"Persona4",
        "month":"6",
        "week":"24",
        "day":"18",
        "dayaverage":0.799332962757087,
        "weekaverage":0.923262727610554,
        "monthaverage":0.769477297163179
      },
      {
        "category":"Persona5",
        "month":"6",
        "week":"24",
        "day":"18",
        "dayaverage":0.669041769041769,
        "weekaverage":0.67394482002558,
        "monthaverage":0.670944920469891
      },
      {
        "category":"Persona6",
        "month":"6",
        "week":"24",
        "day":"18",
        "dayaverage":0.656381486676017,
        "weekaverage":0.722973507315144,
        "monthaverage":0.69689774371321
      },
      {
        "category":"Persona7",
        "month":"6",
        "week":"24",
        "day":"18",
        "dayaverage":0.540495407737267,
        "weekaverage":0.576413277444205,
        "monthaverage":0.693495281755596
      }
    ]
```

Out format

```
[
   {
      name: 'dayaverage',
      data: [0.5, 0.146477031224456, 1.25559947299078, 0.799332962757087, 0.669041769041769, 0.656381486676017, 0.540495407737267]
   },
   {
     name: 'weekaverage',
     data: [1.33333333333333, 0.194758246723904, 1.43618513323983, 0.923262727610554, 0.67394482002558, 0.722973507315144, 0.576413277444205]
   }, {
     name: 'monthaverage',
     data: [1.53571428571429, 0.601273296708939, 0.998426393184655, 0.769477297163179, 0.670944920469891, 0.69689774371321, 0.693495281755596]
   }
].
```

<https://stackoverflow.com/questions/42814907/group-values-with-the-same-key-in-an-array-of-objects>

```javascript
var personas = [{
    "category": "Persona1",
    "month": "6",
    "week": "24",
    "day": "18",
    "dayaverage": 0.5,
    "weekaverage": 1.33333333333333,
    "monthaverage": 1.53571428571429
  },
  {
    "category": "Persona2",
    "month": "6",
    "week": "24",
    "day": "18",
    "dayaverage": 0.146477031224456,
    "weekaverage": 0.194758246723904,
    "monthaverage": 0.601273296708939
  },
  {
    "category": "Persona3",
    "month": "6",
    "week": "24",
    "day": "18",
    "dayaverage": 1.25559947299078,
    "weekaverage": 1.43618513323983,
    "monthaverage": 0.998426393184655
  },
  {
    "category": "Persona4",
    "month": "6",
    "week": "24",
    "day": "18",
    "dayaverage": 0.799332962757087,
    "weekaverage": 0.923262727610554,
    "monthaverage": 0.769477297163179
  },
  {
    "category": "Persona5",
    "month": "6",
    "week": "24",
    "day": "18",
    "dayaverage": 0.669041769041769,
    "weekaverage": 0.67394482002558,
    "monthaverage": 0.670944920469891
  },
  {
    "category": "Persona6",
    "month": "6",
    "week": "24",
    "day": "18",
    "dayaverage": 0.656381486676017,
    "weekaverage": 0.722973507315144,
    "monthaverage": 0.69689774371321
  },
  {
    "category": "Persona7",
    "month": "6",
    "week": "24",
    "day": "18",
    "dayaverage": 0.540495407737267,
    "weekaverage": 0.576413277444205,
    "monthaverage": 0.693495281755596
  }
];
var criteria = ['dayaverage', 'weekaverage', 'monthaverage'];

function getMerged(objArr, criteria) {
    var dataMap = objArr.reduce(function (result, current) {
        criteria.forEach(function (elem) {
            if (result[elem] != undefined) {
                result[elem].push(current[elem]);
            }
            else {
                result[elem] = [current[elem]];
            }
        });
        return result;
    }, {});

    return criteria.map(function (elem) {
        return {
            name: elem,
            data: dataMap[elem]
        };
    });
}

console.log(getMerged(personas, criteria));
```

Ví dụ 3:

```
var data = [
	{ name: "fieldA", value: 20,value1: 31 }, 
	{ name: "building", value: 21,value1: 32 }, 
	{ name: "fieldA", value: 22,value1: 33 }, 
	{ name: "building", value: 23,value1: 34 }
];
var result = Object.values(data.reduce((acc, { name, value,value1 }) => {
	acc[name] = acc[name] || { name, value: 0,value1:0 };
	acc[name].value += value;
	acc[name].value1 += value1;
	return acc;
}, {}));
console.log(result);
```

![](/files/JNcc7TdxcDsbu9UcSNbd)

**Một bài toán kinh điển xử lý bên kintone**

```
var arrs = [{
	"app": 187,
	"id": "1",
	"record": {
		"定時内時間計": {
			"value": 8
		},
		"残業時間計": {
			"value": 1.25
		},
		"作業時間合計": {
			"value": 9.25
		},
		"現金区分": {
			"value": "現金"
		},
		"数値_15": 8,
		"工程B": 22,
		"工程C": 0
	}
}, {
	"app": 187,
	"id": "2",
	"record": {
		"定時内時間計": {
			"value": 2
		},
		"残業時間計": {
			"value": 0
		},
		"作業時間合計": {
			"value": 2
		},
		"現金区分": {
			"value": "現金"
		},
		"数値_15": 0,
		"工程B": 0,
		"工程C": 2
	}
}, {
	"app": 187,
	"id": "8",
	"record": {
		"定時内時間計": {
			"value": 2
		},
		"残業時間計": {
			"value": 0
		},
		"作業時間合計": {
			"value": 2
		},
		"現金区分": {
			"value": "現金"
		},
		"数値_15": 2,
		"工程B": 0,
		"工程C": 0
	}
}, {
	"app": 187,
	"id": "6",
	"record": {
		"定時内時間計": {
			"value": 2
		},
		"残業時間計": {
			"value": 0
		},
		"作業時間合計": {
			"value": 2
		},
		"現金区分": {
			"value": "現金"
		},
		"数値_15": 2,
		"工程B": 2,
		"工程C": 3
	}
}, {
	"app": 187,
	"id": "6",
	"record": {
		"定時内時間計": {
			"value": 2
		},
		"残業時間計": {
			"value": 0
		},
		"作業時間合計": {
			"value": 2
		},
		"現金区分": {
			"value": "現金"
		},
		"数値_15": 2,
		"工程B": 2,
		"工程C": 3
	}
}, {
	"app": 187,
	"id": "6",
	"record": {
		"定時内時間計": {
			"value": 3
		},
		"残業時間計": {
			"value": 0
		},
		"作業時間合計": {
			"value": 2
		},
		"現金区分": {
			"value": "現金"
		},
		"数値_15": 2,
		"工程B": 2,
		"工程C": 3
	}
}];
Bài toán:
Giữ nguyên định dạng của mảng, những id nào trùng nhau thì cộng lại giá số (ok)
```

```
const results = arrs.reduce((acc, val, record) => {
	const findName = acc.find(_ => _.id === val.id);
	if (findName) {
		var one = (findName.record.定時内時間計.value) ? (findName.record.定時内時間計.value) : 0;
		var _one = (val.record.定時内時間計.value) ? (val.record.定時内時間計.value) : 0;
		var two = (findName.record.残業時間計.value) ? (findName.record.残業時間計.value) : 0;
		var _two = (val.record.残業時間計.value) ? (val.record.残業時間計.value) : 0;
		var three = one + _one + two + _two;
		findName.app = val.app;
		findName.record.定時内時間計 = {value: one + _one};
		findName.record.残業時間計 = {value: two + _two};
		findName.record.作業時間合計 = {value: three};
		findName.record.数値_15 = findName.record.数値_15 + val.record.数値_15;
		findName.record.工程B = findName.record.工程B + val.record.工程B;
		findName.record.工程C = findName.record.工程C + val.record.工程C;
	} else {
		acc.push(val);
	}
	return acc;
}, []);
console.log(results);
```

Kết quả:

```
[
    {
        "app": 187,
        "id": "1",
        "record": {
            "定時内時間計": {
                "value": 8
            },
            "残業時間計": {
                "value": 1.25
            },
            "作業時間合計": {
                "value": 9.25
            },
            "現金区分": {
                "value": "現金"
            },
            "数値_15": 8,
            "工程B": 22,
            "工程C": 0
        }
    },
    {
        "app": 187,
        "id": "2",
        "record": {
            "定時内時間計": {
                "value": 2
            },
            "残業時間計": {
                "value": 0
            },
            "作業時間合計": {
                "value": 2
            },
            "現金区分": {
                "value": "現金"
            },
            "数値_15": 0,
            "工程B": 0,
            "工程C": 2
        }
    },
    {
        "app": 187,
        "id": "8",
        "record": {
            "定時内時間計": {
                "value": 2
            },
            "残業時間計": {
                "value": 0
            },
            "作業時間合計": {
                "value": 2
            },
            "現金区分": {
                "value": "現金"
            },
            "数値_15": 2,
            "工程B": 0,
            "工程C": 0
        }
    },
    {
        "app": 187,
        "id": "6",
        "record": {
            "定時内時間計": {
                "value": 7
            },
            "残業時間計": {
                "value": 0
            },
            "作業時間合計": {
                "value": 7
            },
            "現金区分": {
                "value": "現金"
            },
            "数値_15": 6,
            "工程B": 6,
            "工程C": 9
        }
    }
]
```

![](/files/5UnRMqszPd4I1WkN32PG)

![](/files/SnfXlN3uo24Fezaeagqz)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://javascriptuse.gitbook.io/advanced/bai-toan-kinh-dien-su-dung-three-dots-lay-tat-ca-cac-key-cua-object-key-same-plus-ok.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
