Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 提起钥匙’;在使用Ramda保留对象其余部分的同时,将值设置为顶层_Javascript_Functional Programming_Ramda.js - Fatal编程技术网

Javascript 提起钥匙’;在使用Ramda保留对象其余部分的同时,将值设置为顶层

Javascript 提起钥匙’;在使用Ramda保留对象其余部分的同时,将值设置为顶层,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我想将其构建到我的compose函数中,以便record的值进入对象的顶层,而其余键保持不变: { record: { seasons: [ 1 ], colors: [ 2 ] }, tag_ids: [ 2091 ] } 我追求的结果是: { seasons: [ 1 ], colors: [ 2 ], tag_ids: [ 2091 ] } 任何键都可能存在,

我想将其构建到我的
compose
函数中,以便
record
的值进入对象的顶层,而其余键保持不变:

{
  record: {
    seasons: [
      1
    ],
    colors: [
      2
    ]
  },
  tag_ids: [
    2091
  ]
}
我追求的结果是:

{
  seasons: [
    1
  ],
  colors: [
    2
  ],
  tag_ids: [
    2091
  ]
}
任何键都可能存在,也可能不存在


我总是用ramda的方式在
compose
函数中完成它。目前,我正在查看
toPairs
,并进行一些相当冗长的转换,但运气不佳。

您可以使用spread操作符

const startingWithAllProps={
记录:{
季节:[
1.
],
颜色:[
2.
]
},
标签标识:[
2091
]
}
无记录的常数开始={
标签标识:[
2091
]
}
无TagID的常数开始={
记录:{
季节:[
1.
],
颜色:[
2.
]
}
}
const moveRecordUpOneLevel=(startingObject)=>{
常数温度={
…startingObject.record,
标记标识:startingObject.tag\u标识
}
返回JSON.parse(JSON.stringify(temp))//以删除任何未定义的道具
}
传输后常数MWITHALLPROPS=将记录移动到一个级别(使用ALLPROPS启动)
无记录传输后的常数=将记录向上移动一级(无记录启动)
const AFTERTRANSPORMWITHOUTTAGIDS=将记录移动到一个级别(无TAGIDS启动)
console.log('AfterTransfermWithAllProps',AfterTransfermWithAllProps)
console.log('AfterTransfermWithoutRecord',AfterTransfermWithoutRecord)

console.log('AfterTransfermWithoutTagID',AfterTransfermWithoutTagID)
这在普通JS中可能比在Ramda中更简单:

const data = { record: { seasons: [1], colors: [2] }, tag_ids: [2091] }

const flattenRecord = ({record = {}, ...rest}) => ({...record, ...rest})

flattenRecord(data) //=> {"colors": [2], "seasons": [1], "tag_ids": [2091]}

如果你仍然想利用Ramda来解决这个问题,考虑查看(或<代码> R.mergeRight < /COD>)和.< /P> < P>你可以使用R.Cype和R.Cyrand和R.PROP来将密钥的内容与原始对象合并,从而可以省略原始密钥。

const{pipe,chain,merge,prop,omit}=R
常数fn=键=>管道(
链(合并,道具(键)),//展平键的内容
省略([key])//删除该键
)
常量数据={记录:{季节:[1],颜色:[2]},标记ID:[2091]}
const result=fn(‘记录’)(数据)
console.log(结果)
这可能也有帮助

const lift=key=>R.converge(R.mergeRight[
R.dissoc(键),
R.道具(钥匙),
]);
常量提升记录=提升(“记录”);
// ====
常数数据={
记录:{
季节:[
1.
],
颜色:[
2.
]
},
标签标识:[
2091
]
};
console.log(
升降记录(数据),
);

可能不存在
记录
字段。如果
记录
不存在,您希望的输出是什么?因为如果你想让对象的其余部分保持原样,上面的方法仍然有效。那么你只是想把记录提高一级吗?很好。您不需要记录默认值,因为对象排列忽略了
未定义的值。合并
在我看来是不必要的。也许稍微简单一点的是
key=>lift(mergeLeft)(prop(key),省略([key]))
。哦,是的,解决方案也不错。非常感谢。