javascript - 在Javascript中通过键本身编辑对象值
问题描述
伙计们。
我正在制作一些商店系统。我必须像这样访问我的对象值。
const store = {
modules: {
A: {
numbers: [1, 2, 3, 4]
},
B: {
chars: ['a', 'b']
}
}
}
const doubled = {
store: {
...store,
modules: {
A: {
numbers: [...store.modules.A.numbers, ...store.modules.A.numbers]
}
}
}
}
const few = {
store: {
...store,
modules: {
A: {
numbers: store.modules.A.numbers.slice(0, 2)
}
}
}
}
但是,这段代码太长了,没有用处。我不喜欢这种方式。
我想让doubled
,few
喜欢这个短代码。(错误代码)
const doubled = {
store: {
...store,
modules: {
A: {
numbers: [...**this.**numbers, ...**this.**numbers]
}
}
}
}
const few = {
store: {
...store,
modules: {
A: {
numbers: **this.**numbers.slice(0, 2)
}
}
}
}
有没有办法通过键本身来编辑对象值?
解决方案
看起来你正在尝试构建一个还原Vuex 状态存储,但是你没有正确表示你的状态转换函数——它们应该是函数,而不是对象。
通用逻辑可以移动到其他纯函数中并通过combineReducers
. 但就我的回答而言,我将使用更加手写的方法:
你只需要这样做:
第 1 步:注意常用功能
const store = {
// same as above
};
function doubleNumbers( arr ) {
return [ ...arr, ...arr ];
}
function take2Numbers( arr ) {
return arr.slice( 0, 2 );
}
function double( store ) {
return {
...store,
modules: {
A: {
numbers: doubleNumbers( store.modules.A.numbers )
}
}
}
}
function few( store ) {
return {
...store,
modules: {
A: {
numbers: take2Numbers( store.modules.A.numbers )
}
}
}
}
第二步:功能组合
这可以通过为numbers
via组合纯函数来在语法上更短cloneStateButUpdateNumbers
:
function doubleNumbers( arr ) {
return [ ...arr, ...arr ];
}
function take2Numbers( arr ) {
return arr.slice( 0, 2 );
}
function cloneStateButUpdateNumbers( store, numbersFunc ) {
return {
...store,
modules: {
A: {
numbers: numbersFunc( store.modules.A.numbers )
}
}
}
}
function double( store ) {
return cloneStateButUpdateNumbers( store, doubleNumbers );
}
function few( store ) {
return cloneStateButUpdateNumbers( store, take2Numbers );
}
第 3 步:语法简洁:
...并通过使用 ECMAScript 6 箭头函数语法和const
:
const doubleNumbers = ( arr ) => [ ...arr, ...arr ];
const take2Numbers = ( arr ) => arr.slice( 0, 2 );
// See https://stackoverflow.com/questions/28770415/ecmascript-6-arrow-function-that-returns-an-object
const cloneStateButUpdateNumbers = ( store, numbersFunc ) => ( {
...store,
modules: {
A: {
numbers: numbersFunc( store.modules.A.numbers )
}
}
} );
const double = ( store ) => cloneStateButUpdateNumbers( store, doubleNumbers );
const few = ( store ) => cloneStateButUpdateNumbers( store, take2Numbers );
达达!
推荐阅读
- python - 用python写一个带有fastq对名称的txt文件
- design-patterns - 该代码是否违反了 Liskov 替换原则?
- ios - 以编程方式全屏打开 iframe 视频
- python - 进入子目录、运行命令并返回的最优雅的方式是什么?
- database - 用于读取 .db 文件的 VSCode 扩展
- java - 在嵌入式 TomEE 8.0 中使用带有 OpenJPA 的实体管理器时出现神秘的“org.apache.openjpa.persistence.PersistenceException:null”异常
- laravel - 使用 laravel 编辑两个唯一值
- macros - 如何使用 C++ 98 标准轻松创建完全“可变参数”函数?
- php - 如何将 My/SQL 数据分类到不同页面上的组中
- javascript - 如何检测消息何时被编辑