使用纯对象本机创建一行来创建keyByValue对象

时间:2018-10-11 12:02:11

标签: javascript

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

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 个答案:

答案 0 :(得分:2)

您可以在单个对象中将值广告关键字与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);

答案 1 :(得分:1)

您的解决方案很好,但是您忘记了const sinon = require("sinon"); const { mockResponse } = require("mock-req-res"); const routerPromiseHandler = require("../../../main/node/handler/PromiseHandler"); describe("Should handle promisse", () => { it("should handle success promise return", () => { const successMessage = { message: "Success" }; const promiseTest = new Promise((resolve, reject) => { resolve(successMessage); }); const mockedRes = mockResponse(); const spyNext = {}; routerPromiseHandler.handle(promiseTest, mockedRes, spyNext, 200); promiseTest.then(() => { sinon.assert.calledWithMatch(mockedRes.status, 200); sinon.assert.calledWithMatch(mockedRes.send, successMessage); }) }); it("should handle error promise return", () => { const errorMessage = { error: "error" }; const promiseError = new Promise((resolve, reject) => { reject(errorMessage); }); const mockedRes = mockResponse(); const nextSpy = sinon.spy(); routerPromiseHandler.handle(promiseError, mockedRes, nextSpy, 200); promiseError .then(() => { // Promise always need the then }) .catch(exception => { sinon.assert.calledWithMatch(nextSpy, errorMessage); }) }); });

您的解决方案:

[]

修复:

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

说明:

Object.values(obj).reduce((acc, value) => Object.assign(acc, {[value]: {}}), {})将使用变量[value] 来生成密钥名称。 (而不是使用单词value作为键-您不需要)。


解决该问题的一种更实用的方法是不在value操作中对对象acc进行更改:(+稍微更改名称)

reduce

答案 2 :(得分:0)

使用ES6的扩展键和计算键功能。

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

Object.values (obj)
.reduce ((res,val) => ({...res, [val]: {}}), {})

//{a: {},b: {}}

答案 3 :(得分:0)

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

var result = Object.values(obj).reduce((map, value) => {map[value] = {}; return map;}, {});

// { a: {}, b: {} }