【问题标题】:How to deep pick in another pick with lodash?如何用 lodash 在另一个选择中进行深度选择?
【发布时间】:2019-02-25 20:21:29
【问题描述】:

现在我有这样的代码:

var object = {
   a: 'a',
   b: 'b',
   c: {
       d: 'd'
   }
}
_.get(object).pick(['a', 'b']).value();

如何深度挑选“喜欢”的属性:

_.get(object).pick(['a', 'b', 'c.d']).value();

【问题讨论】:

  • @OriDrori 具有属性 a、b 和 d 的对象

标签: javascript lodash


【解决方案1】:

你可以在没有 lodash 的情况下进行深度解构:

var object = {
  a: 'a',
  b: 'b',
  c: {
      d: 'd'
  }
}

const { a, b, c :{ d }} = object;

console.log(a,b,d);

const obj = {a, b, d};

console.log(obj);

【讨论】:

  • 它不像 _.pick 那样组成新对象
  • 是的,但您可以随时构建它const obj = {a,b,d}
  • 这只适用于原始值......它根本不深,只有浅
【解决方案2】:

如果您坚持使用 Lodash,请考虑使用 _.get() 函数:

_.get(object, 'c.d');

所以,对于你想要获取的属性:

const selectedProps = {
  ..._.pick(object, ['a', 'b']),
  _.get(object, 'c.d')
}

【讨论】:

  • 当尝试在 _.pick() 中使用 _.get() 时,会抛出异常“无法将对象转换为原始值”
  • @NikitaIskorkin 应该单独使用,没有_.pick
  • 以及如何创建具有我需要的属性的新对象?
【解决方案3】:

您可以创建flatPick() 函数。该函数迭代路径数组。并使用_.get() 获取path 的值,并使用_.set() 将路径的最后一部分作为属性添加到结果对象上:

function flatPick(object, paths) {
  const o = {};

  paths.forEach(path => _.set(
    o,
    _.last(path.split('.')),
    _.get(object, path)
  ));

  return o;
}

var object = {
  a: 'a',
  b: 'b',
  c: {
    d: 'd',
    e: {
      f: 'f'
    }
  }
};

var result = flatPick(object, ['a', 'b', 'c.d', 'c.e.f']);

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

【讨论】:

    【解决方案4】:

    这适用于lodash

    function pickNested(object: Json, fields: string[]) {
        const shallowFields = fields.filter((field) => !field.includes('.'));
        const deepFields = fields.filter((field) => field.includes('.'));
    
        const initialValue = _.pick(object, shallowFields) as Json;
    
        return deepFields.reduce((output, field) => {
            const key = _.snakeCase(field);
            output[key] = _.get(object, field);
            return output;
        }, initialValue);
    }
    
    

    和:

    const json = {
        id: '10',
        user: {
            email: 'david.i@example.com',
        },
    };
    
    const newData = pickNested(json, ['id', 'user.email']);
    console.log('newData ->', newData);
    /*
    {
        id: '10',
        user_email: 'david.i@example.com',
    };
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2018-06-19
      • 2019-10-22
      • 2016-03-01
      相关资源
      最近更新 更多