Фильтр Lodash и удаляем как потоки java

Пожалуйста, не поднимайте / уменьшайте этот ответ или не отмечайте его как ответ.

Ответ Eugen Rieck является лучшим, но его похоронили в комментариях.

Ответ, который он связал с , показывает, как использовать class_alias (), чтобы назвать класс для определения. Это полезно, если вы пишете класс библиотеки и хотите, чтобы имя пользователя было им угодно, например, установив определение в файле конфигурации.

Итак, если вы пишете библиотеку, содержащую MyLibraryClass, вы можете позволить пользователю называть его чем-то вроде LC для краткости, чтобы они могли писать LC :: someFunction () или LC-> someFunction вместо того, чтобы писать все это.

0
задан Salvo 13 July 2018 в 10:13
поделиться

3 ответа

Вы можете перебрать массив и отклонить элементы в child_array, которые вам не нужны. Обратите внимание, что это изменит исходный объект.

const obj = [{"father_id":1,"name":"father 1","child_array":[{"id":11,"name":"father 1 child 1"},{"id":12,"name":"father 1 child 2"}]},{"father_id":2,"name":"father 2","child_array":[{"child_id":21,"name":"father 2 child 1"},{"child_id":22,"name":"father 2 child 2 - TO DELETE"}]}];

_.forEach(obj, item => {
  item.child_array = _.reject(item.child_array, {child_id: 22});
});

console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

0
ответ дан 31piy 17 August 2018 в 13:10
поделиться
  • 1
    это непросто, в исходной структуре данных у меня очень большая и глубокая древовидная структура, но спасибо – Salvo 13 July 2018 в 10:35

Я думаю, что важно понять, что lodash работает точно так, как ожидалось в вашем примере. Проблема в том, что вы flatMap(f=>f.child_array) сказали lodash, чтобы взять child_array и вернуть его в следующую операцию цепочки. Затем он сделал так, как ожидалось, чтобы удалить дочерний элемент, который соответствовал идентификатору, а оставшаяся часть - дочерняя коллекция, запрошенная вами по возврату из flatMap.

Кажется, что вы действительно хотите, это карта через fathers удалить дочерний элемент, который совпадает с идентификатором, а затем вернуть the father.

Например, это сделало бы это:

var data = [
{
      "father_id": 1,
      "name": "father 1",
      "child_array": [
        {
          "child_id": 11,
          "name": "father 1 child 1"
        },
        {
          "child_id": 12,
          "name": "father 1 child 2"
        }
      ]
    },
    {
      "father_id": 2,
      "name": "father 2",
      "child_array": [
        {
          "child_id": 21,
          "name": "father 2 child 1"
        },
        {
          "child_id": 22,
          "name": "father 2 child 2 - TO DELETE"
        }
      ]
    }  
]

removeById = (id, data) => _.map(data, father => {
  father.child_array = _.reject(father.child_array, { child_id: id })
  return father
})

console.log(removeById(22, data)) // 2 fathers with 2nd child removed from 2nd father
console.log(removeById(11, data)) // 2 fathers with 1 child each now
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

0
ответ дан Akrion 17 August 2018 в 13:10
поделиться

IMHO, вы также можете использовать Vanilla ES6 для достижения аналогичного выхода следующим образом:

var arr =[{"father_id":1,"name":"father 1","child_array":[{"id":11,"name":"father 1 child 1"},{"id":12,"name":"father 1 child 2"}]},{"father_id":2,"name":"father 2","child_array":[{"child_id":21,"name":"father 2 child 1"},{"child_id":22,"name":"father 2 child 2 - TO DELETE"}]}];

var newArr = arr.map(obj => {
  return obj.child_array[0].child_id ? 
         (obj.child_array = obj.child_array.filter(c => c.child_id != 22), obj) 
         : obj;
});

console.log(newArr);

0
ответ дан BlackBeard 17 August 2018 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: