【问题标题】:JavaScript adding zero for non existing keys in arrayJavaScript为数组中不存在的键添加零
【发布时间】:2020-03-27 09:23:24
【问题描述】:

我有两个数组:

date_array = ["2020-02-27", "2020-02-28", "2020-02-29", "2020-03-01", "2020-03-02", "2020-03-03", "2020-03-04", "2020-03-05", "2020-03-06", "2020-03-07", "2020-03-08", "2020-03-09", "2020-03-10", "2020-03-11", "2020-03-12", "2020-03-13", "2020-03-14", "2020-03-15", "2020-03-16", "2020-03-17", "2020-03-18", "2020-03-19", "2020-03-20", "2020-03-21", "2020-03-22", "2020-03-23", "2020-03-24", "2020-03-25", "2020-03-26", "2020-03-27"]

count_array=[{date: "2020-03-22", count: 310},
 {date: "2020-03-23", count: 115},
 {date: "2020-03-24", count: 78},
 {date: "2020-03-25", count: 29},
 {date: "2020-03-26", count: 36},
 {date: "2020-03-27", count: 3}]

我需要创建一个包含 30 个元素的第三个数组,其中只有 count 的值,如果当天不存在计数,则返回 0。我该如何实现?

我试过了:

date_array.forEach(element => {
                if (
                  data[date_array.indexOf(element)].date ==
                  date_array[element]
                ) {
                  target_array.push(data[data.indexOf(element)].count_array);
                } else {
                  target_array.push(0);
                }
            });

但我收到“无法读取未定义的属性‘日期’”

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:

    为了降低计算复杂度,首先将数组转换为按日期索引的对象。然后,要制作输出数组,只需 .map date_array 通过查找对象上的日期,与 0 交替:

    date_array = ["2020-02-27", "2020-02-28", "2020-02-29", "2020-03-01", "2020-03-02", "2020-03-03", "2020-03-04", "2020-03-05", "2020-03-06", "2020-03-07", "2020-03-08", "2020-03-09", "2020-03-10", "2020-03-11", "2020-03-12", "2020-03-13", "2020-03-14", "2020-03-15", "2020-03-16", "2020-03-17", "2020-03-18", "2020-03-19", "2020-03-20", "2020-03-21", "2020-03-22", "2020-03-23", "2020-03-24", "2020-03-25", "2020-03-26", "2020-03-27"]
    count_array=[{date: "2020-03-22", count: 310},
     {date: "2020-03-23", count: 115},
     {date: "2020-03-24", count: 78},
     {date: "2020-03-25", count: 29},
     {date: "2020-03-26", count: 36},
     {date: "2020-03-27", count: 3}]
    
    const countsByDate = Object.fromEntries(
      count_array.map(({ date, count }) => [date, count])
    );
    const output = date_array.map(date => countsByDate[date] || 0);
    console.log(output);

    【讨论】:

    • 不错的一个! .map 帮助了我。我第一次使用 .each 但这似乎更小更快。几分钟前发现这个用 WebSocket 客户端建立一个列表。
    【解决方案2】:

    我会选择@CertainPerformance 发布的解决方案,但只是为了提供一种替代方案,在现代 javascript(Babel 和现代浏览器的新版本)中,可能会有类似的东西:

    var count = date_array.map(date => 
                  count_array.find(item => item.date === date)?.count ?? 0);
    

    find的数组方法,optional chainingnullish coalescing操作符。

    此外,它不是很优化,因为 find 正在为每个 map 的迭代查找整个数组(这就是为什么我会选择另一个答案),但对于一个小数组来说它可以忽略不计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 2020-12-08
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多