【问题标题】:One liner function to iterate over array of objects and change one value一个用于迭代对象数组并更改一个值的线性函数
【发布时间】:2020-01-29 06:32:34
【问题描述】:

假设我有一个这样的对象数组:

let x = [{'a': 0.288888, 'b': 0.5}, {'a':9.565464645654, 'b': 0.6}];

我想对此进行迭代并将数字更改为固定长度。我试过了

x.map((data) => data.a.toFixed(3))
# ["0.289", "9.565"]

预期输出:

[{'a': 0.289, 'b': 0.5}, {'a':9.565, 'b': 0.6}]

使其发挥作用的一种方法是:

x.map((data) => {
    data.a = data.a.toFixed(3);
    return data;
});

还有其他/更好的方法吗?

【问题讨论】:

    标签: javascript iteration


    【解决方案1】:

    使用forEach 并对现有对象进行变异:

    const x = [{'a': 0.288888, 'b': 0.5}, {'a':9.565464645654, 'b': 0.6}];
    x.forEach((data) => data.a = data.a.toFixed(3));
    console.log(x);

    这与您的.map 在一行中所做的相同,但.map 只应用于创建一个新数组 - 如果您只寻找副作用,请使用forEach .

    如果你不想变异又想创建一个新数组,那么在.map中返回一个新对象:

    const x = [{'a': 0.288888, 'b': 0.5}, {'a':9.565464645654, 'b': 0.6}];
    const changedX = x.map(({ a, b }) => ({ a: a.toFixed(3), b }));
    console.log(changedX);

    如果您的目标是代码可读性(这可能是大多数脚本最重要的事情),我建议 反对 尝试将所有内容压缩到一行 - 它不会使事情更具可读性,通常情况正好相反。

    要使第一个 sn-p 通过 no-return-assignarrow-parens 规则,请在函数体周围加上括号,使其不是简洁的函数体:

    x.forEach((data) => { data.a = data.a.toFixed(3) });
    

    Demo

    【讨论】:

    • 好的,你的第一个解决方案有效,但我的 ESLint 抛出错误,Arrow function should not return assignment.eslint(no-return-assign)。有什么办法可以避免吗?
    • 你可以在函数体周围加上括号,这样它就不是一个简洁的函数体:x.forEach((data) => { data.a = data.a.toFixed(3) });
    • 哈哈!显然,这是另一个 ESLint 违规。Unexpected parentheses around single function argument having a body with no curly braces.eslint(arrow-parens).
    • 您确定这是上述注释中代码的错误消息吗?没有意义,因为该函数 确实 有花括号
    • 如果您的目标是代码可读性(这可能是大多数脚本最重要的事情),我建议 反对 尝试将所有内容压缩到一行 - 它不会使事情更具可读性,通常情况恰恰相反。
    【解决方案2】:

    尝试使用forEach循环

    x.forEach((elem) => elem.a = elem.a.toFixed(3));
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      这里是单线。与您的 map 方法调用几乎相同,但只需使用 ({}) 作为返回值以避免显式返回语句。

      let x = [
        { a: 0.288888, b: 0.5 },
        { a: 9.565464645654, b: 0.6 }
      ];
      
      const updated = x.map(data => ({
        ...data,
        a: data.a.toFixed(3)
      }));
      
      console.log(updated);

      // 解构

      let x = [
        { a: 0.288888, b: 0.5 },
        { a: 9.565464645654, b: 0.6 }
      ];
      
      const updated = x.map(({ a, b }) => ({
        a: a.toFixed(3),
        b,
      }));
      
      console.log(updated);

      【讨论】:

        【解决方案4】:

        你可以使用Destructing assignment:

        let x = [
          { a: 0.288888, b: 0.5 },
          { a: 9.565464645654, b: 0.6 }
        ];
        x = x.map(data => ({...data, a: data.a.toFixed(3)}));
        console.log(x);

        【讨论】:

          猜你喜欢
          • 2021-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-23
          • 2021-11-08
          • 2020-04-06
          • 1970-01-01
          相关资源
          最近更新 更多