[英]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")
]
我尝试使用map
, values
, unnest
和flatten
的组合,但是没有运气。 理想情况下,我希望此方法可以起作用,以便无论嵌套的对象和键名称如何,它都可以展平。
与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())
这是一个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.