使用 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")
]
我试过使用 map
、values
、unnest
和 flatten
的组合,但没有成功。理想情况下,我希望它能够工作,以便无论嵌套对象和键名如何,它都会变平。
如果你想要简单的 Javascript 解决方案。
假设 - 对象嵌套到 1 层,如 OP
中所示
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())
将 R.when 与 R.has 和 R.prop 结合使用,从地图中具有 属性 的对象中提取值。
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>
和另一个 来提取 unknown/multiple 道具,并将结果展平:
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>
这里是 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);
我有以下数据结构,其中包含 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
的组合,但没有成功。理想情况下,我希望它能够工作,以便无论嵌套对象和键名如何,它都会变平。
如果你想要简单的 Javascript 解决方案。
假设 - 对象嵌套到 1 层,如 OP
中所示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())
将 R.when 与 R.has 和 R.prop 结合使用,从地图中具有 属性 的对象中提取值。
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>
和另一个
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>
这里是 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);