【问题标题】:Lodash map keys and values on an objectLodash 映射对象上的键和值
【发布时间】:2017-07-27 18:16:23
【问题描述】:

我的代码:

const orig = {" a ":1, " b ":2}
let result = _.mapKeys(_.mapValues(orig, (v) => v + 1), (v, k) => k.trim())

实际和期望的结果 = { “a2, “乙”:3 }

但是有没有更好的 Lodashy 方法呢?

【问题讨论】:

标签: javascript lodash


【解决方案1】:

这个解决方案使用_.transform(),而且它有点短。我不确定它是否比您的功能解决方案更好。

const orig = {" a ": 1, " b ": 2 };

const result = _.transform(orig, (r, v, k) => {
  r[k.trim()] = v + 1; 
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

如果没有 lodash,我会使用 Object.entries() 提取键和值,map 将它们转换为所需的形式,然后使用 Object.fromEntries() 转换回对象:

const orig = {" a ": 1, " b ": 2 };

const result = Object.fromEntries(Object.entries(orig).map(([k, v]) => [k.trim(), v + 1]));

console.log(result);

【讨论】:

  • 就我个人而言,我更喜欢您的回答,感谢您,我现在一直都在使用它:)
  • 只是一个关于使用短函数语法(...args) => 'doing work'的FYI。我遇到了一个问题,这将在v(在您的示例中)的第一个实例为false 时停止。为避免这种情况,请将逻辑封装在大括号 {} 中,这样它就不会将布尔值解释为是否继续迭代集合中的所有项目。
  • @Erutan409 - 好电话。实际上,如果表达式的计算结果为 false,则变换停止。我已经用卷发包裹起来了。
【解决方案2】:

为了完整起见,这就是没有 lodash 的方式:

解决方案 1:Object.keys & reduce

const orig = {" a ":1, " b ":2};
let result = Object.keys(orig).reduce((r, k) => {
  r[k.trim()] = orig[k] + 1;
  return r;
}, {})
console.log(result);

解决方案 2:Object.entries & reduce

如果你对 IE 使用 polyfill 没问题,你也可以这样做:

const orig = {" a ":1, " b ":2};
let result = Object.entries(orig).reduce((r, [k, v]) => {
  r[k.trim()] = v + 1;
  return r;
}, {})
console.log(result);

解决方案 3:Object.keys/Object.entries 和 Array.forEach

上述方法的主要问题之一是您需要使用 reduce 语句返回结果。这不是一个大问题,但会增加行数。另一种方法如下

const orig = {" a ":1, " b ":2};
let result = {};
Object.keys(orig).forEach(k => result[k.trim()] = orig[k] + 1);
console.log(result);

const orig = {" a ":1, " b ":2};
let result = {};
Object.entries(orig).forEach(([k, v]) => result[k.trim()] = v + 1);
console.log(result);

【讨论】:

    【解决方案3】:

    这样的事情怎么样?

    const orig = {" a ":1, " b ":2};
    
    function test(object) {
      let out = {};
    
      _.forEach(object, function(value, key) {
        out[key.trim()] = value + 1;
      });
    
      return out;
    }
    
    console.log(test(orig));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

      【解决方案4】:

      使用 reduce 你可以做到:

      var obj = {" a ":1, " b ":2}
      
      result = _.reduce(obj, (result, v, k) => {
        result[k.trim()] = v + 1
        return result
      }, {})
      
      console.log(result)
      <script src="https://cdn.jsdelivr.net/npm/lodash@latest/lodash.min.js"></script>

      reduce 更熟悉,但 IMO 变换在这里似乎更合适

      【讨论】:

        【解决方案5】:

        你可以使用一个好的 ol'for in 循环,因为它看起来更干净

        const orig = {" a ":1, " b ":2};
        let result = {};
        for (const key in orig) {
          result[key.trim()] = orig[key] + 1
        }
        // result {a: 2, b: 3} 
        
        

        你甚至可以把它做成一个班轮.. :)

        const orig = { ' a ': 1, ' b ': 2 };
        let result = {}; for (const key in orig) result[key.trim()] = orig[key] + 1;
        // result {a: 2, b: 3} 
        

        【讨论】:

          猜你喜欢
          • 2017-02-08
          • 1970-01-01
          • 2016-05-05
          • 2016-05-31
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多