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-27,2020-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”)周日的输出。所以我把我的时区放在你的时区,它就起作用了。我修正了我的时区,增加了一天