对象继续替换数组中的当前对象

时间:2019-09-24 16:58:52

标签: javascript arrays

我的目标是在days数组中添加新对象,但它会继续替换数组中的现有对象。我不知道问题所在。

当前结果:

[{"name":"Tuesday","value":"Tues"},{"name":"Tuesday","value":"Tues"},{"name":"Tuesday","value":"Tues"}]

这是代码:

var query = "Sunday,Monday,Tuesday";
var day = {day: "", value: ""}
var days = [];

query.split(",").map(p => {

 switch (p) {
      case "Sunday":
        day ["day "] = "Sunday";
        day ["value"] = "Sun";
        break;
      case "Monday":
        day ["day "] = "Monday";
        day ["value"] = "Mon";
        break;
      case "Tuesday":
         day ["day "] = "Tuesday";
         day ["value"] = "Tues";
        break;
    }

    days.push(day);
});

document.getElementById("demo").innerHTML = JSON.stringify(days);

2 个答案:

答案 0 :(得分:0)

您可以在switch语句中将对象作为返回值。如果找不到字符串,则返回一个带有空字符串的对象。

此方法使用从Array#map返回的数组。

var query = "Sunday,Monday,Tuesday",
    days = query.split(",").map(p => {
        var day = { day: "", value: "" };
        switch (p) {
            case "Sunday": return { day: "Sunday", value: "Sun" };
            case "Monday": return { day: "Monday", value: "Mon" };
            case "Tuesday": return { day: "Tuesday", value: "Tues" };
        }
        return { day: "", value: "" };
    });

console.log(days);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

当前代码不断将一个对象引用推入结果数组;在day回调中定义map可以解决此问题,但是引起side effects并不是map的意图。

Array#map接受一个回调参数,该参数应为每个元素返回转换后的值。 map本身的返回值是新的变异结果数组。回调不应推送到外部数组。

使用switch语句冗长且难以维护,从而导致大量重复代码。

const query = "Sunday,Monday,Tuesday";
const days = query.split(",").map(e => {
  return {day: e, value: e.substr(0, 3)};
});

console.log(days);

我注意到您希望"Tues"为4个字符的缩写,而"Sun""Mon"为3。如果确实是期望的结果,我建议使用一个单独的对象来存储这些转换:

const query = "Sunday,Monday,Tuesday";
const abbreviations = {Tuesday: "Tues"};
const days = query.split(",").map(e => {
  return {day: e, value: abbreviations[e] || e.substring(0, 3)};
});

console.log(days);

基本上,这将检查是否指定了特殊的缩写,否则仅返回前三个字符。