【问题标题】:How do I assign values to keys when I merge 2 objects with .map()?当我将 2 个对象与 .map() 合并时,如何为键赋值?
【发布时间】:2022-01-09 12:23:42
【问题描述】:

我正在使用.map() 循环遍历一个对象并将一些值放入第二个对象。

我就是这样做的:

function convertGraphItems(name, data) {
  return ({ name, data, type: 'bar', stack: true });
}

var generatedArr = [...dataByAccountName.entries()].map(convertGraphItems);

但是,我似乎无法将“名称”和“数据”分配给它们各自的键。

我尝试过return ({ name: name, data: data, type: 'bar', stack: true });,但这并没有达到我想要的效果。

我的期望结果应该如下所示:

[
    {
        "name": "Savings",
        "data": [
            5474.18,
            114031.26,
            127890.72
        ],
        "type": "bar",
        "stack": true
    }
]

但我的当前结果是:

[
    {
        "name": [
            "Savings",
            [
                5474.18,
                114031.26,
                127890.72
            ]
        ],
        "data": 0,
        "type": "bar",
        "stack": true
    }
]

有人知道我如何将dataname 分配给他们各自的键吗?

编辑:源数组看起来像:

[
    {
        "key": "Savings",
        "value": [
            5474.18,
            114031.26,
            127890.72
        ]
    },
]

【问题讨论】:

  • 你的源数组是什么样子的?
  • @decpk 添加在上面
  • dataByAccountName 来自哪里?由于您使用的是.entries(),我认为它是Map

标签: javascript jquery arrays


【解决方案1】:

您将convertGraphItems 函数传递给map,并且您期望name 作为keydata 作为value,但这里不是这种情况。

map 中,第一个参数是值,第二个参数是index。 您必须使 convertGraphItems 兼容,这样您才能在外部传递值:

[...dataByAccountName.entries()].map(function ([_, { key, value }]) {
  return convertGraphItems(key, value);
});

const dataByAccountName = [
  {
    key: "Savings",
    value: [5474.18, 114031.26, 127890.72],
  },
];

function convertGraphItems(name, data) {
  return { name, data, type: "bar", stack: true };
}

var generatedArr = [...dataByAccountName.entries()].map(function ([, v]) {
  const { key, value } = v;
  return convertGraphItems(key, value);
});
console.log(generatedArr);

【讨论】:

  • 我完全忘记了Array.prototype.entries()?
  • @Phil 我也在想为什么phil 在这里使用了地图。他也可以使用地图和条目来实现结果。尽管 Map 的解决方案很棒并且效果很好。因为你知道我从你的回答中学到了很多东西。 ?
  • 使用数组条目是一个非常奇怪的选择(对于 OP,而不是你)。看起来他们根本对指数不感兴趣。您的结果也不像 OP 想要的那样
【解决方案2】:

如果问题中包含的源数组已经可用,则不需要单独的函数。

const sources = [{
  "key": "Savings",
  "value": [5474.18, 114031.26, 127890.72]
}]
const parsedData = sources.map(({key, value}) => ({
  name: key,
  data: value,
  type: 'bar',
  stack: true
}));

console.log(parsedData)

【讨论】:

    【解决方案3】:

    传递给Array.prototype.map() 回调的前两个参数是

    • element

      数组中正在处理的当前元素。

    • index

      当前正在处理的元素在数组中的索引。

    您似乎不太可能希望 data 成为索引。

    const dataByAccountName = [{"key":"Savings","value":[5474.18,114031.26,127890.72]}]
    
    const generatedArr = dataByAccountName.map(({ key: name, value: data }) => ({
      name,
      data,
      type: "bar",
      stack: true
    }))
    
    console.log(generatedArr)
    .as-console-wrapper { max-height: 100% !important; }

    如果您正在使用其他产生条目的东西(例如地图),那么这就是您要映射它的方式

    const dataByAccountName = new Map()
    dataByAccountName.set("Savings", [
      5474.18,
      114031.26,
      127890.72
    ])
    
    const generatedArr = Array.from(dataByAccountName, ([ name, data ]) => ({
      name,
      data,
      type: "bar",
      stack: true
    }))
    
    console.log(generatedArr)
    .as-console-wrapper { max-height: 100% !important; }

    自 IMO 以来,我一直使用 Array.from(),它看起来比 [...map.entries()].map() 更好,并且达到了完全相同的效果。

    请注意,传递给映射回调的第一个(也是唯一一个)参数是一个解构数组,而不是两个单独的参数。

    【讨论】:

    • 谢谢。无论如何,没有箭头功能可以做到这一点吗?出于某种原因,我工作的编译器不喜欢它们
    • @MeltingDog 什么“编译器”?假设您的 spread syntax 有效,箭头函数不起作用似乎很奇怪
    • 这有点超出我的能力 - 他们使用一些 .net CMS,必须将 .JS 编译成一个文件或类似的东西。老实说,我不确定价差运算符是否会起作用,但当我遇到它时,我会越过那座桥。
    猜你喜欢
    • 2020-11-10
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多