0

我有以下包含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没有运气。理想情况下,我希望它能够工作,以便无论嵌套对象和键名如何,它都会变平。valuesunnestflatten

4

3 回答 3

6

将 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>

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>

于 2018-11-13T18:55:51.620 回答
0

如果您想要纯 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())

于 2018-11-13T18:49:56.930 回答
0

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);
于 2018-11-13T18:57:11.427 回答