繁体   English   中英

转换为键值对

[英]converting to to key value pairs

这是我的 object

    const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ];
    let arr = [];


    for (const [key, value] of Object.entries(...upToPaidCost)) {
        arr.push({ key: key, value: value });
    }
    console.log(upToPaidCost)
    console.log(arr);

预期 output:

    [
        {
          key: "Labour Cost",
          value: 54000
        },
        {
          key: "Material Cost",
          value: 24900
        }
    ]

它只显示第一个键值,第二个丢失了,我在这里做错了什么?

问题是, Object.entries需要一个 object,而你有一个数组。 这就是为什么你需要两个循环:

 const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ]; let arr = []; for (const obj of upToPaidCost) { for (const [key, value] of Object.entries(obj)) { arr.push({key, value}); } } console.log(arr);

或两个嵌套的map

arr = upToPaidCost.flatMap(obj =>
    Object.entries(obj).map(([key, value]) => ({key, value})))

您可以使用以下代码来执行此操作

 const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ]; let arr = []; const updatedArr = upToPaidCost.map((item)=>{ return {"key":Object.keys(item)[0],"value":item[Object.keys(item)[0]]} }) console.log(updatedArr)

在此链接中测试https://replit.com/join/taxflvkp-gauthamjm007

如我所见,原始数组中的每个项目都是 object。 所以你可以这样做而不是迭代。

此外,根据预期的 output,value 是一个数字。 所以你可以像这样从字符串转换为数字。

 const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ]; const result = upToPaidCost.map(o => { const [key, value] = Object.entries(o)[0]; return {key, value: +value}; }); console.log(result);

我喜欢我的代码更具可读性。 替代答案。

 const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ]; let arr = []; const final = upToPaidCost.map((item)=>{ const key = Object.keys(item)[0] return { key, value: item[key] } }) console.log(final)

Object.entries(...upToPaidCost)等于Object.entries({ 'Labour Cost': '54000' }) ,所以结果是错误的。

我们需要先用reduce方法组合对象:

const upToPaidCost = [{ "Labour Cost": "54000" }, { "Material Cost": "24900" }];
let arr = [];
const conbineObj = upToPaidCost.reduce(
  (res, item) => ({ ...res, ...item }),
  {}
);
for (const [key, value] of Object.entries(conbineObj)) {
  arr.push({ key: key, value: value });
}
console.log(upToPaidCost);
console.log(arr)

为什么你的代码片段会这样工作?

在这一行

for (const [key, value] of Object.entries(...upToPaidCost))

您正在传播upToPaidCost ,然后要求Object.entries将其作为类似数组的形式返回。

所以从技术上讲是这样的:

Object.entries({ 'Labour Cost': '54000' }, { 'Material Cost': '24900' })

如您所见,您将 2 个对象(参数)传递给Object.entries ,它只接受其中一个(第一个)

所以这条线会这样解释

for (const [key, value] of [['Labour Cost': '54000']])`

如何更正片段?

您可以将Object.entries(...upToPaidCost)替换为Object.entries(upToPaidCost)所以Object.entries只得到一个简单的参数

然后在for循环中,可以将每个object推送到arr

你可以在这里查看:

 const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ]; let arr = []; for (const [arrayindex, innerObject] of Object.entries(upToPaidCost)) { arr.push(innerObject); } console.log(upToPaidCost); console.log(arr);

如您所见,这些值仍然是字符串,如果您要将它们转换为数字,则可以获取键和值并创建新对象并将它们推送到arr ,如下所示:

 const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ]; let arr = []; for (const [upToPaidCostIndex, innerObject] of Object.entries(upToPaidCost)) { const key = Object.keys(innerObject)[0]; const value = Object.values(innerObject)[0]; arr.push({[key]: +value}); } console.log(upToPaidCost); console.log(arr);

更好的解决方案

 const upToPaidCost = [ { 'Labour Cost': '54000' }, { 'Material Cost': '24900' } ]; const upToPaidCosts = upToPaidCost.reduce((res, item) => ({...item, ...res}), {}); const arr = Object.entries(upToPaidCosts).map(([key, value]) => ({[key]: +value})) console.log(upToPaidCost); console.log(arr);

在这里Object.entries(...upToPaidCost)删除...
使用... 当您想复制 object 时,例如: const x = {...upToPaidCost};
或为您的情况使用Object.entries({...upToPaidCost})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM