我有一个对象数组,如下所示:
[
{
"_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
}
]
将来这个数组将包含更多的对象。 我正在尝试使用 map 来解决这个问题,因为它似乎相当复杂。 这就是挑战: 我如何计算有多少对象具有一定的值(value)?我怎样才能知道有人今天预订了多少次===1?最好的结果是这样的数组:
[{dayOne: 2}, {dayTwo: 5}, {dayThree:1}.......and so on],
其中value
是一天被预订的次数(键)的值,因此某个对象(具有特定值)在数组中出现了多少次?
提前谢谢您!
最佳答案
要按条件对对象进行计数,您可以使用 .filter
--
let firstDayCount = arr.filter(x => x.day === "1").length;
要按天对结果进行分组,您可以使用 .reduce
--
let countByDays =
arr.reduce((res, { day }) => {
res[day] = res[day] || 0;
res[day] += 1;
return res;
}, {});
如果您想格式化输出,则可以使用名称字典 --
let dayNames = { 1: "dayOne", 2: "dayTwo" /* and so on */}
let formattedResult =
Object.keys(countByDays)
.map(n => { [dayNames[n]]: countByDays[n] });
<小时/>
请注意,使用 .filter
用于计数创建一个中间丢弃数组。我们不会在任何地方存储引用,因此必须尽快对其进行 GC,但如果它确实在现实场景中显着影响您的性能,您可以使用 .reduce
相反 - 名为 "deforestation" 的东西:)
let count = arr.reduce((cnt, el) => el.day === "1" ? cnt += 1 : cnt, 0);
它仍然会创建一个中间匿名对象——一个reducer函数——所以如果你的分析器显示这个地方是瓶颈,你可能最好使用 for
环形。与往常一样,在这种情况下,您需要在自己的实际场景中找到性能和可读性之间的正确位置。
关于javascript - 计算数组中有多少个对象具有特定值(JavaScript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50556853/