使用ramda压平各种数组

gos*_*eti 0 javascript arrays functional-programming ramda.js

我有以下数据结构,其中包含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")
  }
]
Run Code Online (Sandbox Code Playgroud)

使用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")
]
Run Code Online (Sandbox Code Playgroud)

我使用的合并审理map,values,unnestflatten,但没有运气.理想情况下,我喜欢这样做,以便无论嵌套对象和键名如何都会变平.

Ori*_*ori 5

将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));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

如果可能有多个键,或者您不知道键的名称,则可以使用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));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

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));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.在你的第二个例子中`when(complement(f))`的次要建议也可以表示为`除非(f)`.第二个例子的另一个选择是`chain(ifElse(is(Date),of values))`. (2认同)