Выровнять массив с помощью ramda - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующая структура данных, которая содержит 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, но безуспешно.В идеале мне бы хотелось, чтобы это работало так, чтобы оно сгладилось независимо от вложенного объекта и имен ключей.

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Используйте 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>
0 голосов
/ 13 ноября 2018

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);
0 голосов
/ 13 ноября 2018

На случай, если вам нужно простое решение 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())
...