карта и глубокий объект с Рамдой - PullRequest
0 голосов
/ 27 марта 2020

Мне нужно отфильтровать по свойствам "сегментов", в этом случае мне нужно отфильтровать по сегментам: [name: "general]

У меня есть следующий массив

const lines = [{
    id: 1191,
    name: "dev",
    segments: []
  },
  {
    id: 1192,
    name: "credit",
    folder: "Embarazadas",
    segments: [{
        "name": "general",
      },
      {
        "name": "custom",
      }
    ]
  },
  {
    id: 1311,
    name: "box",
    segments: [{
      "name": "custom",
      "line_id": 1431,
      "id": 21,
      "active": true
    }]
  },
  {
    id: 2000,
    name: "sin folder",
    folder: null,
    segments: [{
        "name": "custom",
      },
      {
        "name": "general",
      }
    ],
  },
  {
    id: 2000,
    name: "credit card",
    segments: [{
      "name": "general",
    }],
  },
]

Мне нужно чтобы получить все объекты с сегментом "general"

я пытался с Рамдой сделать это, но я не получил результат, сначала я сделал карты линий, а затем фильтр. Проблема в том, что иногда атрибуты сегментов прибывает пустой

const filterLinesBySegments = (lines) => {
  const filter = (line) => {
    const hasSegments =R.filter(seg => seg["name"] === "general")(line.segments)
    const newLine = R.compose(
      R.assoc("segments", hasSegments),
    )(line)
    return newLine

  }
  const new= R.map(item => {
      return R.filter(line => {
        return filter(line)
      })(item)

  })(lines)

  return new;
}   

1 Ответ

1 голос
/ 27 марта 2020

Чтобы сохранить только строки с общим сегментом, вы можете использовать R.filter с R.where для фильтрации по указанному c свойству. Поскольку segments является массивом, используйте R.any для поиска, если у некоторых объектов есть name из general.

. Чтобы удалить пользовательский из сегмента, вы можете развить сегменты объекта и отклонить все предметы с name: custom.

const { filter, where, any, propEq, reject, evolve, pipe, map } = R

const filterLinesBySegments = filter(where({
  segments: any(propEq('name', 'general'))
}))

const filterCustomFromSegments = evolve({
  segments: reject(propEq('name', 'custom'))
})

const fn = pipe(
  filterLinesBySegments,
  map(filterCustomFromSegments),
)

const lines = [{"id":1191,"name":"dev","segments":[]},{"id":1192,"name":"credit","folder":"Embarazadas","segments":[{"name":"general"},{"name":"custom"}]},{"id":1311,"name":"box","segments":[{"name":"custom","line_id":1431,"id":21,"active":true}]},{"id":2000,"name":"sin folder","folder":null,"segments":[{"name":"custom"},{"name":"general"}]},{"id":2000,"name":"credit card","segments":[{"name":"general"}]}]

const result = fn(lines)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
...