Как получить удаленный или вставленный элемент из массива прокси?

Я пытаюсь обнаружить изменения в массиве объектов, используя прокси JavaScript.

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

Текущий код

target = [{ id: 1, a: 'a' }, { id: 2, a: 'b' }];
proxy = new Proxy(target, {
    get: function (target, property: string, receiver) {
        if (property === 'pop') {
            console.log('deleted object', target[target.length - 1]);
        }
        console.log('get', property);
        // property is index in this case
        return target[property];
    },
    set: function (target, property, value, receiver) {
        console.log('set', property, 'to', value);
        target[property] = value;
        // you have to return true to accept the changes
        return true;
    }
});

Текущие мысли: я сделал небольшой обходной путь, чтобы получить удаленный элемент из массива, но он работает только для pop() метод, потому что он удаляет последний элемент из массива. Но мне нужен способ получить изменения, даже если они сделаны с использованием splice метод или push или же pop,

Благодарю.

[Обновление]Решение, которое я нашел:

https://github.com/ElliotNB/observable-slim Я использовал эту библиотеку для обнаружения изменений в массиве, я также могу обнаружить изменения вложенных свойств в массиве. Это именно то, что я искал.

Я использую эту библиотеку потому, что она использует прокси.

3 ответа

Обратитесь к приведенному ниже коду для справки:

Я рекомендую не выставлять фактическую цель на геттер. Вы можете создать функцию-оболочку для поддержки модификатора cutosom. Посмотрите на приведенный ниже пример.

Я надеюсь, что это поможет. отредактированный

var target = [2, 5, 7];
target.oldPop = Array.prototype.pop;
target.oldPush = Array.prototype.push;
target.oldSlice = Array.prototype.slice;
target.pop = function() {
    var elem = this.oldPop();
    console.log("deleted element: " + elem);
    return elem;
}
target.push = function(...items) {
    var len = this.oldPush(...items);
    console.log("Inserted element: " + items);
    return len;
}
target.slice = function(start, end) {
    var new_arr = this.oldSlice(start, end);
    console.log("Array sliced.");
    return new_arr;
}
target.slice();

Пожалуйста, спросите, если какой-либо запрос:)

Другие вопросы по тегам