繁体   English   中英

使用Ramda拼合各种数组

[英]Flatten assorted array using ramda

我有以下包含Date对象的数据结构,其中一些嵌套在对象内部:

[
  new Date("2018-11-20T09:00:00.000Z"),
  new Date("2018-11-19T09:00:00.000Z"),
  {
    "before": new Date("2018-12-14T00:00:00.000Z")
  }
]

我想使用ramda将其展平,使其变为:

[
  new Date("2018-11-20T09:00:00.000Z"),
  new Date("2018-11-19T09:00:00.000Z"),
  new Date("2018-12-14T00:00:00.000Z")
]

我尝试使用mapvaluesunnestflatten的组合,但是没有运气。 理想情况下,我希望此方法可以起作用,以便无论嵌套的对象和键名称如何,它都可以展平。

与R.has和R.prop一起使用R.when从具有地图内部属性的对象中提取值。

 const { pipe, map, when, has, prop } = R; const extractOrVal = (p) => map(when(has(p), prop(p))); const extractOrValBefore = extractOrVal('before'); const data = [ new Date("2018-11-20T09:00:00.000Z"), new Date("2018-11-19T09:00:00.000Z"), { "before": new Date("2018-11-14T00:00:00.000Z") } ]; console.log(extractOrValBefore(data)); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script> 

如果可以有多个键,或者您不知道键的名称,则可以使用R.values。 这将从对象中提取不是日期的所有值:

 const { chain, values, unless, is } = R; const extractAndFlatten = chain(unless(is(Date), values)); const data = [ new Date("2018-11-20T09:00:00.000Z"), new Date("2018-11-19T09:00:00.000Z"), { "before": new Date("2018-12-14T00:00:00.000Z") } ]; console.log(extractAndFlatten(data)); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script> 

斯科特·克里斯托弗(Scott Christopher)的另一个建议是提取未知/多个道具,并将结果展平:

 const { chain, ifElse, is, of, values } = R; const extractAndFlatten = chain(ifElse(is(Date), of, values)); const data = [ new Date("2018-11-20T09:00:00.000Z"), new Date("2018-11-19T09:00:00.000Z"), { "before": new Date("2018-12-14T00:00:00.000Z") } ]; console.log(extractAndFlatten(data)); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script> 

如果您想要简单的Javascript解决方案。

假设-如OP中所示,对象嵌套到1级

 var arr = [ "2018-11-20T09:00:00.000Z", "2018-11-19T09:00:00.000Z", { "before": "2018-11-14T00:00:00.000Z" } ] var result = arr.map(d => typeof d == "object" ? Object.values(d) : d) console.log(result.flat()) 

https://ramdajs.com/docs/#map

这是一个repl和代码:

let arr = [
"2018-11-20T09:00:00.000Z",
"2018-11-19T09:00:00.000Z",
{
  "before": "2018-11-14T00:00:00.000Z"
}
];

R.map((item) => item.before || item, arr);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM