我具有以下数据结构,其中包含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
的组合,但是没有运气。理想情况下,我希望它可以正常工作,以便无论嵌套的对象和键名称如何,它都可以展平。
答案 0 :(得分:5)
与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。这将从对象中提取所有非Date的值:
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>
和另一个suggestion by 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>
答案 1 :(得分:0)
如果您想要简单的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())
答案 2 :(得分:0)
这里是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);