【问题标题】:How to filter keys of an object with lodash?如何使用 lodash 过滤对象的键?
【发布时间】:2015-08-23 23:07:21
【问题描述】:

我有一个带有一些键的对象,我只想保留一些键的值?

我试过filter:

const data = {
  aaa: 111,
  abb: 222,
  bbb: 333
};

const result = _.filter(data, (value, key) => key.startsWith("a"));

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

但它会打印一个数组:

[111, 222]

这不是我想要的。

如何用 lodash 做到这一点?或者如果 lodash 不工作的其他东西?

【问题讨论】:

    标签: javascript filter lodash


    【解决方案1】:

    Lodash 有一个 _.pickBy 函数,它完全符合您的要求。

    var thing = {
      "a": 123,
      "b": 456,
      "abc": 6789
    };
    
    var result = _.pickBy(thing, function(value, key) {
      return _.startsWith(key, "a");
    });
    
    console.log(result.abc) // 6789
    console.log(result.b)   // undefined
    <script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

    【讨论】:

    • 这似乎在 lodash 版本 4 中被破坏了,新的 _.pickBy 谓词仅使用值而不是键调用。 Boo :( ...我想您可以链接 _.pick 和 _.pickBy (实际上不,您无法获得相同的功能)
    • 这不再适用于最新的 Lodash,仅供参考
    • @EudisDuran 你必须使用.pickBy
    • 好像已经用最新版本修复了
    【解决方案2】:

    只需将过滤器更改为omitBy

    const data = { aaa: 111, abb: 222, bbb: 333 };
    const result = _.omitBy(data, (value, key) => !key.startsWith("a"));
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

    【讨论】:

    • 这还不打印一个数组吗?
    • 谢谢!我认为我们可以使用_.pick
    • 这不再适用于最新的 lodash,仅供参考
    【解决方案3】:

    这是一个使用lodash 4.x 的示例:

    const data = {
      aaa: 111,
      abb: 222,
      bbb: 333
    };
    
    const result = _.pickBy(data, (value, key) => key.startsWith("a"));
    
    console.log(result);
    // Object { aaa: 111, abb: 222 }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
    <strong>Open your javascript console to see the output.</strong>

    【讨论】:

      【解决方案4】:

      原生ES2019单行

      const data = {
        aaa: 111,
        abb: 222,
        bbb: 333
      };
      
      const filteredByKey = Object.fromEntries(Object.entries(data).filter(([key, value]) => key.startsWith("a")))
      
      console.log(filteredByKey);

      【讨论】:

        【解决方案5】:

        一种以相当可读和有效的方式解决此问题的非 lodash 方法:

        function filterByKeys(obj, keys = []) {
          const filtered = {}
          keys.forEach(key => {
            if (obj.hasOwnProperty(key)) {
              filtered[key] = obj[key]
            }
          })
          return filtered
        }
        
        const myObject = {
          a: 1,
          b: 'bananas',
          d: null
        }
        
        const result = filterByKeys(myObject, ['a', 'd', 'e'])
        console.log(result) // {a: 1, d: null}

        【讨论】:

          【解决方案6】:

          const data = {
            aaa: 111,
            abb: 222,
            bbb: 333
          };
          const result = Object.keys(data).filter((val) => val.includes("a"));
          console.log(result);

          【讨论】:

          • 这是一种过滤对象键的非 lodash 方式,原始问题说明了一种使用 lodash 过滤对象键的方法。
          • @ShahidManzoorBhat OP 提到他可以使用非 lodash 解决方案,但此解决方案将返回一个键数组,而不是只包含所需键的对象。
          【解决方案7】:

          纯JS解决方案:

          const data = {
            aaa: 111,
            abb: 222,
            bbb: 333
          };
          
          const result = Object.keys(data).filter( key => {
            return key.indexOf('a') == 0
          }).map( key => {
            return { key: data[key] }
          })
          
          console.log(result)
          
          1. 筛选以字母“a”开头的键的数据
          2. 将这些键映射到正确的值,并作为 key:value 对象返回

          【讨论】:

            【解决方案8】:

            您可以使用_.omit() 函数。

            它接受 过滤键 作为字符串数组,如下所示:

            var object = { a: 1, b: 2, c: 3 }
            _.omit(object, ['a', 'c'])
            // => { b: 2 }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-10-30
              • 1970-01-01
              • 2016-05-24
              • 1970-01-01
              • 2016-11-17
              • 2018-08-22
              相关资源
              最近更新 更多