【问题标题】:How to pattern match in javascript object如何在 javascript 对象中进行模式匹配
【发布时间】:2020-05-11 23:13:43
【问题描述】:

对于以下问题,我可以使用任何 lodash 方法在 javascript 中进行模式匹配吗?

我有钥匙 = [x, y, z] 和对象 = { x: 'a', x0: 'a0', y: 'b', y0: 'b1', y1: 'c', k: 'k', k1: 'k1'..}

我需要得到{ x: 'a', x0: 'a0', y: 'b' , y0: 'b1', y1: 'c'}的结果。

基本上,我需要给出一个键数组和一个对象,它应该返回一个对象,其中包含所有键,其中一个键作为子字符串。

【问题讨论】:

    标签: javascript ecmascript-6 lodash


    【解决方案1】:

    不确定lodash,但您可以使用本机 JavaScript 相当简单地做到这一点:

    const keys = [ 'x', 'y', 'z'];
    const object = { x: 'a', x0: 'a0', y: 'b', y0:'b1', y1:'c', k:'k', k1:'k1'};
    
    const validEntries = Object.entries(object)
      .filter(([key, val]) => keys.some(k => key.includes(k)));
    const result = Object.fromEntries(validEntries);
    console.log(result);

    【讨论】:

      【解决方案2】:

      不知道有任何 lodash 方法可以做到这一点,但这并不复杂:

      const keys = ['x', 'y', 'z'];
      const obj = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c' };
      const matched = keys.reduce((acc, key) => {
        Object.entries(obj)
          .filter(([k]) => k.includes(key))
          .forEach(([k, v]) => (acc[k] = v));
        return acc;
      }, {});
      

      【讨论】:

        【解决方案3】:

        您可以遍历对象的键并检查键数组

        const keys = ['x', 'y', 'z'] 
        const object = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c', k:'k' ,k1:'k1'}
        
        // result as = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c'}
        
        const result = Object.keys(object).reduce((acc, rec) => {
          // if current key has sub-string for any value in keys array
          if(keys.filter(it => rec.indexOf(it) > -1).length > 0) {
            return {...acc, [rec]: object[rec]}
          }
          return acc
        }, {})
        
        console.log(result)

        【讨论】:

          【解决方案4】:

          您可以使用pickBy,但要使用自定义谓词

          const keys = [ 'x', 'y', 'z'];
          const object = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c', k:'k' ,k1:'k1'};
          
          const filtered = _.pickBy(object, (value,key)=>keys.some(k=>key.includes(k)));
          
          console.log(filtered);
          <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

          如果你想为不同的键重用它,你可以创建一个“谓词”函数来重用

          const keyIncludes = (partialKeys) => (value, key) => partialKeys.some(partialKey => key.includes(partialKey));
          
          const keys = [ 'x', 'y', 'z'];
          const object = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c', k:'k' ,k1:'k1'};
          
          const filtered = _.pickBy(object, keyIncludes(keys));
          
          console.log(filtered);
          <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

          【讨论】:

            猜你喜欢
            • 2021-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-16
            • 2011-10-02
            • 2017-11-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多