Lodash: Как удалить элемент или вложенный элемент из массива, используя идентификатор? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть массив, который выглядит следующим образом:

[
    {
        "id": "denuzi",
        "sub":
        [
            {"id": "s4p58o"},
            {"id": "xzbqi"},
        ],
    },
    {
        "id": "4rcodm",
        "sub": [],
    }
]

Я пытаюсь удалить элемент из массива или из вложенного массива, используя предоставленный идентификатор.

например, если указано denuzi, тогда удаляется весь первый объект;если предоставляется s4p58o, то только этот объект из первого подмассива объектов удаляется.

Я знаю, что могу удалить весь объект с помощью следующего кода:

_.remove(this.items, function(item) {
    return item.id !== id;
});

Но яНе знаете, как сделать проверку, чтобы удалить подпункт?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

без использования lodash

let data = [
    {
        "id": "denuzi",
        "sub":
        [
            {"id": "s4p58o"},
            {"id": "xzbqi"},
        ],
    },
    {
        "id": "4rcodm",
        "sub": [],
    }
]
function remove(data, removeId){
  return data
    .filter(({id}) => id!==removeId) // removes parent object if its id matches removeId
    .map(({id, sub}) => ({id, sub: sub.filter(({id}) => id!==removeId)})) // replaces sub array with new sub array with subobject missing
}

console.log(remove(data, "s4p58o")); 
console.log(remove(data, "denuzi"))

С Лодаш

const data = [
    {
        "id": "denuzi",
        "sub":
        [
            {"id": "s4p58o"},
            {"id": "xzbqi"},
        ],
    },
    {
        "id": "4rcodm",
        "sub": [],
    }
]


function remove(data, removeId){
  return _.remove(data, (item) => item.id !== removeId)  // removes parent object if its id matches removeId
    .map(({id, sub}) => ({id, sub: _.remove(sub, (item) => item.id !== removeId)})) // replaces sub array with new sub array with subobject missing
}

// i parse data to do a deep copy for showing the property
console.log(remove(JSON.parse(JSON.stringify(data)), "s4p58o")); 
console.log(remove(JSON.parse(JSON.stringify(data)), "denuzi"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 26 февраля 2019

Вы можете использовать итеративный и рекурсивный подход, проверив id или позвонив снова для sub.Выход, если найден.

function remove(array, id) {
    return array.some((o, i, a) => o.id === id
        ? a.splice(i, 1)
        : remove(o.sub || [], id)
    );
}

var array = [{ id: "denuzi", sub: [{ id: "s4p58o" }, { id: "xzbqi" }] }, { id: "4rcodm", sub: [] }];

remove(array, 's4p58o');
console.log(array);

remove(array, 'denuzi');
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 26 февраля 2019

Просто используйте Array.prototype.filter

var list = [
    {
        "id": "denuzi",
        "sub":
        [
            {"id": "s4p58o"},
            {"id": "xzbqi"},
        ],
    },
    {
        "id": "4rcodm",
        "sub": [],
    }
]

const result = list.filter(a => a.id !== 'denuzi');

console.log(result);
...