如何更改对象内的数组
How to alter array inside an object
我有这个JSON
{
"Entries": [{
"JobId": 7322,
"DayOfTheWeek": "Wednesday",
"Punchouts": ["2016-05-05T09:50:00", "2016-05-05T12:20:00"],
"PunchIns": ["2016-05-05T10:10:00", "2016-05-05T12:40:00"]
}, {
"JobId": 7322,
"DayOfTheWeek": "Thursday",
"Punchouts": ["2016-05-05T09:50:00"],
"PunchIns": ["2016-05-05T09:40:00"]
}]
}
我会改成
{
"Entries": [{
"JobId": 7322,
"DayOfTheWeek": "Wednesday",
"Punchout1": "2016-05-05T09:50:00",
"Punchout2": "2016-05-05T12:20:00",
"PunchIn1": "2016-05-05T10:10:00",
"PunchIn2": "2016-05-05T12:40:00"
}, {
"JobId": 7322,
"DayOfTheWeek": "Thursday",
"Punchout1": "2016-05-05T09:50:00",
"Punchout2": "",
"PunchIn1": "2016-05-05T09:40:00"
"PunchIn2": "",
}]
}
我想压缩数组。该数组的最大长度 = 2。即使长度为 0 / 1,该数组也应为 PunchOut1/PunchOut2 和 [=31= 的空字符串]
这样实现的。
for (var i = 0; i < data.Entries.length; i++) {
var entry = data.Entries[i];
if (entry["Punchouts"].length == 0) {
entry["PunchOut1"] = "";
entry["PunchOut2"] = "";
}
if (entry["Punchouts"].length == 1) {
entry["PunchOut1"] = entry["Punchouts"][0];
entry["PunchOut2"] = "";
}
if (entry["Punchouts"].length == 2) {
console.log("in");
entry["PunchOut1"] = entry["Punchouts"][0];
entry["PunchOut2"] = entry["Punchouts"][1];
}
delete entry["Punchouts"];
// do same for PunchIns.
}
Fiddle: https://jsfiddle.net/codeandcloud/rpgx28gy/
什么是更优化的(最好是 lodash)方式?
var remappedEntries = _.map(data.Entries, e => ({
JobId: e.JobId,
DayOfTheWeek: e.DayOfTheWeek,
PunchOut1: e.PunchOuts[0] || "",
PunchOut2: e.PunchOuts[1] || "",
PunchIn1: e.PunchIns[0] || "",
PunchIn2: e.PunchIns[1] || "",
}));
这使用了 lodash 的映射,它遍历每个值并为您提供一个迭代函数,您可以使用该函数将该条目重新映射到另一个对象。请注意,您根本不需要为此使用 lodash,您可以使用 Array.prototype.map
函数,假设您的目标浏览器支持它。您还可以使用垫片。
如果您想修改完全相同的对象而不是获取副本,您可以使用 _.forEach
,或者继续使用映射并丢弃之前的对象。真的取决于你的情况。
我还使用了箭头函数,它使它变得更简单,从每个 "e" 到您想要 return 的对象。或者,这可以是一个带一个参数的命名函数或匿名函数。
对于每个 punchout,我都利用了您可以检查数组的优势,即使它没有对象。在这种情况下,它将 return 未定义。对于那些,我们通过使用条件或将它们默认为空字符串,因为 undefined 被认为是 "falsy" 并且表达式将 return 为空字符串。如果它有一个值,它会使用那个值。
我有这个JSON
{
"Entries": [{
"JobId": 7322,
"DayOfTheWeek": "Wednesday",
"Punchouts": ["2016-05-05T09:50:00", "2016-05-05T12:20:00"],
"PunchIns": ["2016-05-05T10:10:00", "2016-05-05T12:40:00"]
}, {
"JobId": 7322,
"DayOfTheWeek": "Thursday",
"Punchouts": ["2016-05-05T09:50:00"],
"PunchIns": ["2016-05-05T09:40:00"]
}]
}
我会改成
{
"Entries": [{
"JobId": 7322,
"DayOfTheWeek": "Wednesday",
"Punchout1": "2016-05-05T09:50:00",
"Punchout2": "2016-05-05T12:20:00",
"PunchIn1": "2016-05-05T10:10:00",
"PunchIn2": "2016-05-05T12:40:00"
}, {
"JobId": 7322,
"DayOfTheWeek": "Thursday",
"Punchout1": "2016-05-05T09:50:00",
"Punchout2": "",
"PunchIn1": "2016-05-05T09:40:00"
"PunchIn2": "",
}]
}
我想压缩数组。该数组的最大长度 = 2。即使长度为 0 / 1,该数组也应为 PunchOut1/PunchOut2 和 [=31= 的空字符串]
这样实现的。
for (var i = 0; i < data.Entries.length; i++) {
var entry = data.Entries[i];
if (entry["Punchouts"].length == 0) {
entry["PunchOut1"] = "";
entry["PunchOut2"] = "";
}
if (entry["Punchouts"].length == 1) {
entry["PunchOut1"] = entry["Punchouts"][0];
entry["PunchOut2"] = "";
}
if (entry["Punchouts"].length == 2) {
console.log("in");
entry["PunchOut1"] = entry["Punchouts"][0];
entry["PunchOut2"] = entry["Punchouts"][1];
}
delete entry["Punchouts"];
// do same for PunchIns.
}
Fiddle: https://jsfiddle.net/codeandcloud/rpgx28gy/
什么是更优化的(最好是 lodash)方式?
var remappedEntries = _.map(data.Entries, e => ({
JobId: e.JobId,
DayOfTheWeek: e.DayOfTheWeek,
PunchOut1: e.PunchOuts[0] || "",
PunchOut2: e.PunchOuts[1] || "",
PunchIn1: e.PunchIns[0] || "",
PunchIn2: e.PunchIns[1] || "",
}));
这使用了 lodash 的映射,它遍历每个值并为您提供一个迭代函数,您可以使用该函数将该条目重新映射到另一个对象。请注意,您根本不需要为此使用 lodash,您可以使用 Array.prototype.map
函数,假设您的目标浏览器支持它。您还可以使用垫片。
如果您想修改完全相同的对象而不是获取副本,您可以使用 _.forEach
,或者继续使用映射并丢弃之前的对象。真的取决于你的情况。
我还使用了箭头函数,它使它变得更简单,从每个 "e" 到您想要 return 的对象。或者,这可以是一个带一个参数的命名函数或匿名函数。
对于每个 punchout,我都利用了您可以检查数组的优势,即使它没有对象。在这种情况下,它将 return 未定义。对于那些,我们通过使用条件或将它们默认为空字符串,因为 undefined 被认为是 "falsy" 并且表达式将 return 为空字符串。如果它有一个值,它会使用那个值。