Пожалуйста, не поднимайте / уменьшайте этот ответ или не отмечайте его как ответ.
Ответ Eugen Rieck является лучшим, но его похоронили в комментариях.
Ответ, который он связал с , показывает, как использовать class_alias (), чтобы назвать класс для определения. Это полезно, если вы пишете класс библиотеки и хотите, чтобы имя пользователя было им угодно, например, установив определение в файле конфигурации.
Итак, если вы пишете библиотеку, содержащую MyLibraryClass, вы можете позволить пользователю называть его чем-то вроде LC для краткости, чтобы они могли писать LC :: someFunction () или LC-> someFunction вместо того, чтобы писать все это.
Вы можете перебрать массив и отклонить элементы в 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>
Я думаю, что важно понять, что 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>
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);