Ramda: дублировать объект по его свойству (массиву) - PullRequest
0 голосов
/ 04 мая 2018

У меня есть объект со свойством массива { property: [a, b] }, и я хочу иметь список дублированных объектов, где [{ property: [a] }, { property: [b] }]

Ввод:

const input = {
  url: 'getting-started',
  locales: ['en-GB', 'en-JP']
}

Ожидаемая форма:

const expected = [{
  url: 'getting-started',
  locales: ['en-GB']
}, {
  url: 'getting-started',
  locales: ['en-JP']
}]

Функция, которую я написал, немного нечитаема и даже не чиста:

const duplicateByLocales = article => R.pipe(
  R.prop('locales'),
  R.invert,
  R.mapObjIndexed((val, locale) =>
    R.pipe(
      R.clone,
      R.assoc('locales', R.of(locale))
    )(article)),
  R.values
)(article)

Это работает, но мне интересно, как может выглядеть лучше? Спасибо!

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете сделать что-то вроде этого:

const input = {
  url: 'getting-started',
  locales: ['en-GB', 'en-JP']
}

let result = input.locales.map(locale => ({...input, locales:[locale]}));
console.log(result);

Имейте в виду, что {...input} создает поверхностную копию input. Если input имеет несколько уровней, это становится немного сложнее.

И мы можем написать для него функцию

const transform = input =>
  input.locales.map(locale => ({...input, locales:[locale]}))

console.log(transform({
  url: 'getting-started',
  locales: ['en-GB', 'en-JP']
}))
...