Javascript 使用计算值、级别转换和新对象创建进行解构

标签 javascript ecmascript-6 destructuring

我从一个 api 收到一个 json 响应,我想从中整理并创建一个新对象。

const things = [{
    "menu": {
      "id": "file",
      "value": "File",
      "popup": {
        "menuitem": [{
            "value": "3",
            "onclick": "CreateNewDoc()"
          },
          {
            "value": "5",
            "onclick": "OpenDoc()"
          },
          {
            "value": "8",
            "onclick": "CloseDoc()"
          }
        ]
      }
    }
  },
  {
    "menu": {
      "id": "image",
      "value": "Image",
      "popup": {
        "menuitem": [{
            "value": "New",
            "onclick": "CreateNewImage()"
          },
          {
            "value": "Open",
            "onclick": "OpenImage()"
          },
          {
            "value": "Close",
            "onclick": "CloseImage()"
          }
        ]
      }
    }
  }
];

我知道这样做的老方法是这样的:

const chs = [];
things.forEach((e) => {
    const i = {};
    i.Id = e.menu.id;
    i.Value = e.menu.value;
    i.PopupValue = e.menu.popup.menuitem[0].value;
    i.SomethingComputed = e.menu.popup.menuitem[0].value - e.menu.popup.menuitem[1];
    i.ShiftedUp = e.menu.popup.menuitem;
    chs.push(ch);
  });

现在我想使用 ES6 和解构来做到这一点。但我认为我没有尽我所能,因为我:1)仍然有循环; 2)必须创建这个新对象;和 3) 需要这些单独的计算线。 我能把它弄得更紧凑吗?

const chs = [];
things.forEach((e) => {
    const {
        Id: {id},
        Value: {value},
        PopupValue : {menu: {popup} },
    } = e;

    // computed 
    const someComputedValue = Value - PopupValue;

    // new object
    const ch = {
        Id,
        Value,
        SomeComputedValue
    }

    chs.push(ch);
});

最佳答案

您可以使用 map() 而不是 forEach(),因此您不需要 chs.push() 步骤结束。

您可以将解构直接放在参数列表中,因此不需要赋值步骤。这是否更具可读性是值得商榷的。

如果 SomeComputedValue 的计算不太复杂,您可以将其直接放在返回的对象中。然后你可以摆脱那个赋值,你可以使用箭头函数的简写形式,它只返回一个值。


const things = [{
    "menu": {
      "id": "file",
      "value": "File",
      "popup": {
        "menuitem": [{
            "value": "3",
            "onclick": "CreateNewDoc()"
          },
          {
            "value": "5",
            "onclick": "OpenDoc()"
          },
          {
            "value": "8",
            "onclick": "CloseDoc()"
          }
        ]
      }
    }
  },
  {},
  {
    "menu": {
      "id": "image",
      "value": "Image",
      "popup": {
        "menuitem": [{
            "value": "New",
            "onclick": "CreateNewImage()"
          },
          {
            "value": "Open",
            "onclick": "OpenImage()"
          },
          {
            "value": "Close",
            "onclick": "CloseImage()"
          }
        ]
      }
    }
  }
];

const chs = things.map(({
menu: {
    id: Id,
    value: Value,
    popup : PopupValue,
} = {id: "defaultID", value: "defaultValue", popup: "defaultPopup"}}) => ({
        Id,
        Value,
        SomeComputedValue: Value - PopupValue
    })
);

console.log(chs);

关于Javascript 使用计算值、级别转换和新对象创建进行解构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55941760/

相关文章:

javascript - 你能在两个 <script src =""> 文件之间自动选择吗?

javascript - 捕获 HTML 输入元素值的所有更改的现代方法是什么?

javascript - 用数组元素替换字符串键

css - 在 NgStyle 中设置高度的 TypeScript 函数不起作用

javascript - 解构 JS 中的不同类型

javascript - 当连字符在属性中时如何解构 e.target?

javascript - 对象解构 ({ x, y, ...rest }) 用于将对象的属性列入白名单

javascript - jQuery - 为什么 $(this) 在子作用域中不起作用?

javascript - 要求 js 文件不会执行

javascript - 在标记函数中连接字符串