代码之家  ›  专栏  ›  技术社区  ›  Yinon

创建keyByValue对象与纯对象本机为一行

  •  3
  • Yinon  · 技术社区  · 6 年前

    我正在尝试创建一个由其他对象键生成的对象。
    消费:

    const obj = {
        someProp1: 'a',
        someProp2: 'b'
    }
    

    预期结果:

    const result = {
        a: {},
        b: {}
    }
    

    我设法用 lodash ,但我想不依赖任何东西。

    _.reduce(obj, (acc, value) => _.set(acc, value, {}), {});
    

    我试着让它天生,但价值来作为'价值'属性。。顺便说一下-我想 keyBy 应该可以这样做,但我无法将空对象定义为所需的值。

    Object.values(obj).reduce((acc, value) => Object.assign(acc, {value: {}}), {})
    

    我做错什么了?

    4 回复  |  直到 6 年前
        1
  •  2
  •   Nina Scholz    6 年前

    您可以使用 computed property name 在单个对象中,并将所有对象与 Object.assign .

    const
        object = { someProp1: 'a', someProp2: 'b' },
        result = Object.assign(...Object.values(object).map(k => ({ [k]: {} })));
        
    console.log(result);

    value 作为关键

    const
        object = { someProp1: 'a', someProp2: 'b' },
        result = Object.values(object).reduce((acc, value) =>
            Object.assign(acc, { [value]: {}}), {})
        
    console.log(result);
        2
  •  1
  •   Stav Alfi    6 年前

    [] .

    您的解决方案:

    Object.values(obj).reduce((acc, value) => Object.assign(acc, {value: {}}), {})

    解决方法:

    Object.values(obj).reduce((acc, value) => Object.assign(acc, {[value]: {}}), {})

    说明:

    这个 [value] 将使用 价值 变量的 value 用于生成密钥名称(而不是用这个词 作为你不想要的钥匙)。


    解决这个问题的一个更实用的方法是不改变对象 acc 内部 reduce 操作:(+稍微更改一下名称)

    const convertObjectValuesToKeys = obj => Object.values(obj)
        .reduce((result, objectValue) => ({
            ...result,
            [objectValue]:{}
        }), {});
        
    const obj = {a: 'a1',b:'b1'};
    
    console.log(convertObjectValuesToKeys(obj));
        3
  •  0
  •   Moritz Roessler    6 年前

    const obj = {
        someProp1: 'a',
        someProp2: 'b'
    }
    
    Object.values (obj)
    .reduce ((res,val) => ({...res, [val]: {}}), {})
    
    //{a: {},b: {}}
    
        4
  •  0
  •   Seth Flowers    6 年前
    const obj = {
      someProp1: 'a',
      someProp2: 'b'
    }
    
    var result = Object.values(obj).reduce((map, value) => {map[value] = {}; return map;}, {});
    
    // { a: {}, b: {} }