javascript - 如何更改对象内的数组

标签 javascript lodash

我有这个 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/PunchOut2PunchIn1/PunchIn2

也应为空字符串

像这样实现它。

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 的映射,它会迭代每个值并为您提供一个 iteratee 函数,您可以使用该函数将该条目重新映射到另一个对象。请注意,您根本不需要为此使用 lodash,您可以使用 Array.prototype.map 函数,假设您的目标浏览器支持它。您还可以使用一些垫片。

如果您不想获取副本而想要修改完全相同的对象,则可以使用 _.forEach,或者继续使用 map 并丢弃以前的对象。确实取决于您的情况。

我还使用了箭头函数,这使得从每个“e”到您想要返回的对象变得更简单。或者,这可以是带有一个参数的命名函数或匿名函数。

对于每个打洞,我利用了即使数组中没有对象也可以检查数组的优势。在这种情况下,它将返回未定义。对于这些,我们通过使用条件或将它们默认为空字符串,因为未定义被认为是“假”,因此表达式将返回空字符串。如果它有一个值,它就会使用该值。

关于javascript - 如何更改对象内的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902567/

相关文章:

javascript - 滚动太远

javascript - React Redux 处理大型嵌套树更新

javascript - Highcharts 将正数和负数的列总和堆叠在一起

javascript - lodash/underscore ,搜索对象的所有属性并转换它们

Javascript - 如何根据定义的坐标修改复杂对象

javascript - 使用 lodash 在数组对象中查找并添加额外的键?

javascript - html() 中的 jQuery 编码

javascript - Javascript中有没有一种方法可以在字符串的字母之间插入字符(例如 "/")?例如JAVA --> J/A/V/A?

javascript - 如何从 JavaScript 中的嵌套对象中过滤掉值

javascript - 使用 lodash 压缩不同大小的数组