Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将json对象键与一周中的某一天进行比较_Javascript_Arrays_Json - Fatal编程技术网

Javascript 如何将json对象键与一周中的某一天进行比较

Javascript 如何将json对象键与一周中的某一天进行比较,javascript,arrays,json,Javascript,Arrays,Json,所以我有一个日期数组: var aryDates = ["2020-07-27", "2020-07-29", "2020-08-01", "2020-08-07", "2020-08-05", "2020-08-03"] 我还有另外三个数组,用于在json中分配: var activities = ["Study", "Go to the g

所以我有一个日期数组:

 var aryDates = ["2020-07-27", "2020-07-29", "2020-08-01", "2020-08-07", "2020-08-05", "2020-08-03"]
我还有另外三个数组,用于在json中分配:

var activities = ["Study", "Go to the gym"]
var times = ["11:30 - 12:30", "18:30 - 19:00"]
var weeks = ["monday", "wednesday"]
我的目标是创建一个JSON,如下所示:

{
  2020-07-27: [{ ----> monday
  name: "Study",
  time: "11:30 - 12:30",
  week: "monday"
}],
  2020-07-29: [{ ----> wednesday
  name: "Go to the gym",
  time: "18:30 - 19:00",
  week: "wednesday"
}],
  2020-08-01: [{ ----> saturday
  name: "undefined",
  time: "undefined",
  week: "undefined"
}],
  2020-08-03: [{ ----> monday
  name: "Study",
  time: "11:30 - 12:30",
  week: "monday"
}],
 2020-08-05: [{ ----> wednesday
  name: "Go to the gym",
  time: "18:30 - 19:00",
  week: "wednesday"
}],
  2020-08-07: [{ ----> friday
  name: "undefined",
  time: "undefined",
  week: "undefined"
}],
}
具有'week'==周一的活动与其他活动一起进入周一的日期,如2020-07-272020-08-03,等等

以下是我到目前为止所做的


我能够创建JSON,但我不知道如何为每个活动周分配日期。

首先,我将在JSFIDLE中复制您的代码,以调试它

var aryDates = ["2020-07-27", "2020-07-29", "2020-08-01", "2020-08-07", "2020-08-05", "2020-08-03"]

 var activities = ["Study", "Go to the gym"]
 var times = ["11:30 - 12:30", "18:30 - 19:00"]
 var weeks = ["monday", "wednesday"]

 const obj = aryDates.map((dates, index) => {
   return ('"' + dates + '":' + "[{" +
     '"name"' + ":" + '"' + activities[index] + '"' + "," +
     '"time"' + ":" + '"' + times[index] + '"' + "," +
     '"week"' + ": " + '"' + weeks[index] + '"' +
     "}]");
 })

 const jsonObj = `{${obj}}`

 console.log(JSON.parse(jsonObj))
当您参考
weeks[index]
时,索引是运行循环的索引,不一定与星期几相关。如果您想获取星期天的代码,可以使用
Date.getDay()
如果您想支持所有星期天,可以使用下面的代码

     var aryDates = ["2020-07-27", "2020-07-29", "2020-08-01", "2020-08-07", "2020-08-05", "2020-08-03"]

 var activities = [null,"Study",null, "Go to the gym",null,null,null]
 var times = [null,"11:30 - 12:30",null, "18:30 - 19:00",null,null,null]
 var weeks = [null,"monday", null,"wednesday",null,null,null]

 const obj = aryDates.map((dates, index) => {
 var d = new Date(dates);
    var dayCode= d.getDay();
   return ('"' + dates + '":' + "[{" +
     '"name"' + ":" + '"' + activities[dayCode] + '"' + "," +
     '"time"' + ":" + '"' + times[dayCode] + '"' + "," +
     '"week"' + ": " + '"' + weeks[dayCode] + '"' +
     "}]");
 })

 const jsonObj = `{${obj}}`

 console.log(JSON.parse(jsonObj))

变量d使用给定的时间,如2020-07-27,并将其转换为javascript日期对象和d.getDay()返回一个与给定日期的星期日相关的数字,星期日为0,星期六为6,我们使用此代码检测哪些活动属于哪个日期。

您可以构建一个地图,跟踪一周中的每一天。地图中的每个键都是从
weeks
开始的一天,并将存储一个对象,该对象具有该天的名称、时间和星期

贴图
本质上类似于一个对象,最终将具有以下形状:

{
  "monday" => {name: "Study", time: "11:30 - 12:30", week: "monday"}
  "wednesday" => {name: "Go to the gym", time: "18:30 - 19:00", week: "wednesday"}
}
(请注意,这不是有效的JS语法,它只是用来表示映射的外观,其中
=>
左侧的字符串是键,
=>
右侧的对象是值)

然后还可以创建一个名为
getDay
的助手函数,该函数将日期转换为日期。 例如:

getDay("2020-07-27") // Outputs: "monday"
然后,您可以在
arydate
上使用
.map()
。对于此数组中的每个日期字符串,可以使用helper函数将其转换为一天。 然后,您可以使用
weeksMap.get()
检查地图,查看它是否包含一个当天的密钥。如果
在映射中(即:如果
“星期一”
“星期三”
,则它将返回其关联的对象值。如果它不在映射中,
.get()
将返回
未定义的

利用这个想法,我们可以使用,它将对象中的键/值“合并”到现有对象中:

{a: 1, ...{a: 0, b: 2}} // Becomes {a: 1, a: 0, b: 0}, Output: {a: 0, b: 2}
{a: 1, ...undefined} // Output: {a: 1}
如您所见,如果展开对象,则展开对象中的任何键都会覆盖原始对象中的键。通过使用以下方法:

{name: undefined, time: undefined, week: undefined, ...weeksMap.get(getDay(date))}
如果
weeksMap.get()
返回带有这些键的对象,您将覆盖名称、时间和星期键

构建对象后,您可以将其添加到数组
[key,value]
,其中
value
是一个带有对象
[object]
的数组(根据您所需的输出)。然后您可以在键值对数组
[key,value],[key2,value2],…]上使用
对象.fromEntries()
,这是我们编写的
.map()
返回的内容

见下例:

const getDay=date=>new date(date).toLocaleDateString(未定义,{weekday:“long”}).toLowerCase();
常数=[“2020-07-27”、“2020-07-29”、“2020-08-01”、“2020-08-07”、“2020-08-05”、“2020-08-03”]。排序((a,b)=>a.localeCompare(b));
持续活动=[“学习”,“去健身房”]
常数时间=[“11:30-12:30”,“18:30-19:00”]
常数周=[“星期一”、“星期三”];
const weeksMap=new Map(weeks.Map((week,i)=>[week{
名称:活动[i],
时间:次[i],
周
}]));
const res=Object.fromEntries(
aryDates.map(date=>[date,[{name:undefined,time:undefined,week:undefined,…weeksMap.get(getDay(date))}]]
);

console.log(res);
用日期分配每个活动周。日期还是天?@Alwayshelving用日期,例如“2020-07-27”。如果活动是在星期一,我想用aryDates数组中的每个日期(星期一)分配此活动。并将它们放在JSON中,正如我在问题中所显示的那样。当您只需要有一个对象在里面吗?每个日期键的值只能是一个对象吗?@Nick Parsons是的,这是我没有解释的,我正在使用这个库,你一天可以有多个对象。很好。我正要发布一个类似的解决方案。@jarwin我在我的答案中添加了更多细节,你可以再看一眼,看看编辑是否有用另外,我不太清楚你所说的“为什么它在json中只显示未定义的内容”是什么意思。json是一种字符串格式,用于表示JavaScript对象/数据。因此它不同于对象(即
res
是什么)。json字符串没有
未定义的值,因此执行
json.stringify()
对于具有未定义值的对象,将从结果中删除这些值。但是,您可以将
未定义的
设置为字符串
“未定义”
,然后使用
JSON.stringify()
如果这就是你要找的。@NickParsons事实上我明白了为什么只有在我看来是未定义的,如果你把你的时钟放在utc-03时区,你会看到getDay(“2020-07-27”)周日的输出。所以我把我的时区放在你的时区,它就起作用了。我修正了我的时区,增加了一天