计算数组中有多少对象具有特定值(JavaScript)

时间:2018-05-27 21:53:24

标签: javascript

我有一个对象数组,如下所示:

[
{
"_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
}
]

将来这个数组将包含更多对象。 我试图用地图解决这个问题,因为它看起来很复杂。 这是挑战: 我如何计算有多少物体具有一定的价值?我怎样才能知道有人多少次预订了一天=== 1?最好的结果是这样的数组:

[{dayOne: 2}, {dayTwo: 5}, {dayThree:1}.......and so on], 

其中value是一天预订的次数(关键)的值,因此某个对象(具有特定值)出现在阵列中的次数是多少次?

提前谢谢!

3 个答案:

答案 0 :(得分:2)

要按条件计算对象,可以使用.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循环。在这种情况下,您可以在自己的真实场景中找到性能和可读性之间的合适位置。

答案 1 :(得分:1)

要准确地以该格式获得结果,您可以执行此操作。

const objs = [
{
"_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
}
]

const days = [['dayOne', 1], ['dayTwo', 2], ['dayThree', 3]];

const res = days.reduce((acc, v) => {
  const obj = {};
  obj[v[0]] = objs.filter(x => x.day == v[1]).length;
  return acc.concat(obj);
}, []);

console.log(res);

请注意,您需要为每个要包含的日期扩展days数组。因此,如果您想要包括所有31天,您需要这样做。

const objs = [
{
"_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
}
]

const days = [['dayOne', 1], ['dayTwo', 2], ['dayThree', 3], ['dayFour', 4], ['dayFive', 5],
              ['daySix', 6], ['daySeven', 7], ['dayEight', 8], ['dayNine', 9], ['dayTen', 10],
              ['dayEleven', 11], ['dayTwelve', 12], ['dayThirten', 13], ['dayFourteen', 14],
              ['dayFifteen', 15], ['daySixteen', 16], ['daySeventeen', 17], ['dayEighteen', 18],
              ['dayNineteen', 19], ['dayTwenty', 20], ['dayTwentyone', 21], ['dayTwentytwo', 22],
              ['dayTwentythree', 23], ['dayTwentyfour', 24], ['dayTwentyfive', 25], ['dayTwentysix', 26],
              ['dayTwentyseven', 27], ['dayTwentyeight', 28], ['dayTwentynine', 29], ['dayThirty', 30],
              ['dayThirtyone', 31]];

const res = days.reduce((acc, v) => {
  const obj = {};
  obj[v[0]] = objs.filter(x => x.day == v[1]).length;
  return acc.concat(obj);
}, []);

console.log(res);

在此示例中返回[{dayOne: 2}, {dayTwo: 0}, ..., {daySeventeen}: 1, {dayNineteen: 0}, ...]

答案 2 :(得分:0)

另一种方法是使用函数reduce进行分组和计数。

const array = [{"_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}],
      result = Object.values(array.reduce((a, {day}) => {
        let key = `day${day}`;
        (a[key] || (a[key] = {[key]: 0}))[key]++;
        return a;
      }, {}));

console.log(result);