我有一个对象数组,如下所示:
[
{
"_id": "5b09cc3495cb6c0487f1166b",
"name": "ccc",
"email": "ccc@gmail.com",
"phone": "790467522",
"kidsNo": "1",
"adultsNo": "1",
"fullDate": "2018/5/1",
"year": "2018",
"month": "5",
"day": "1",
"chosenHour": "11:00",
"chosenRoom": "x",
"__v": 0
},
{
"_id": "5b09cc6095cb6c0487f1166c",
"name": "asd",
"email": "asd@asd.pl",
"phone": "790467522",
"kidsNo": "2",
"adultsNo": "3",
"fullDate": "2018/5/1",
"year": "2018",
"month": "5",
"day": "1",
"chosenHour": "12:00",
"chosenRoom": "x",
"__v": 0
},
{
"_id": "5b0b1560c7b4fd0c33b2d52e",
"name": "dddd",
"email": "dddd@ddd.pl",
"phone": "123123112",
"kidsNo": "2",
"adultsNo": "1",
"fullDate": "2018/5/17",
"year": "2018",
"month": "5",
"day": "17",
"chosenHour": "11:00",
"chosenRoom": "x",
"__v": 0
}
]
Run Code Online (Sandbox Code Playgroud)
将来这个数组将包含更多的对象。我正在尝试使用地图来解决这个问题,因为它似乎相当复杂。这就是挑战:我如何计算有多少对象具有一定的价值?我怎样才能知道有人今天预订了多少次===1?最好的结果是这样的数组:
[{dayOne: 2}, {dayTwo: 5}, {dayThree:1}.......and so on],
Run Code Online (Sandbox Code Playgroud)
value每天被预订的次数(键)的值在哪里,因此某个对象(具有特定值)在数组中出现了多少次?
先感谢您!
小智 6
要按条件对对象进行计数,您可以使用.filter--
let firstDayCount = arr.filter(x => x.day === "1").length;
Run Code Online (Sandbox Code Playgroud)
要按天对结果进行分组,您可以使用.reduce--
let countByDays =
arr.reduce((res, { day }) => {
res[day] = res[day] || 0;
res[day] += 1;
return res;
}, {});
Run Code Online (Sandbox Code Playgroud)
如果你想格式化你的输出,你可以使用名称字典 -
let dayNames = { 1: "dayOne", 2: "dayTwo" /* and so on */}
let formattedResult =
Object.keys(countByDays)
.map(n => { [dayNames[n]]: countByDays[n] });
Run Code Online (Sandbox Code Playgroud)
请注意,使用 a.filter进行计数会创建一个中间的一次性数组。我们不会在任何地方存储引用,因此必须尽快对它进行 GC,但如果它确实在现实场景中显着影响您的性能,您可以使用一种.reduce称为“毁林”的东西来代替:)
let count = arr.reduce((cnt, el) => el.day === "1" ? cnt += 1 : cnt, 0);
Run Code Online (Sandbox Code Playgroud)
但它仍然会创建一个中间匿名对象——一个减速器函数——所以如果你的分析器显示这个地方是瓶颈,你可能最好使用循环for。与往常一样,在这种情况下,您需要在自己的现实场景中找到性能和可读性之间的正确位置。
| 归档时间: |
|
| 查看次数: |
2823 次 |
| 最近记录: |