我正在尝试创建一个由其他对象键生成的对象。
消费:
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: {}}), {})
我在做什么错了?
答案 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: {} }