Как установить значение элементов массива в их положение в массиве в JavaScript - PullRequest
0 голосов
/ 23 марта 2020

У меня есть массив объектов, таких как:

let array = [{ position:0 },{ position:1 },{ position:2 }]

Я sh что каждый объект должен хранить свою собственную позицию и обновлять ее, когда его позиция изменяется.

Я использую - array.splice (); удалить объект, а затем с помощью этого l oop снова вычислить их позиции -

for(let i = 0, length1 = array.length; i < length1; i++){ array[i].position=i; }

Но я хочу, чтобы это было сделано автоматически без цикла. Есть ли способ достичь это в js.

1 Ответ

2 голосов
/ 23 марта 2020

.... и обновлять его при изменении его позиции

Это хитрый бит, вам нужно либо обернуть прокси вокруг массива и обновить позиции, когда все будет изменить:

let array = [{position: 0},{position: 1},{position: 2}];
function updateIndexes(array) {
    array.forEach((entry, index) => {
        entry.position = index;
    });
}
let parray = new Proxy(array, {
    defineProperty(target, key, descriptor) {
        const result = Reflect.defineProperty(target, key, descriptor);
        updateIndexes(target);
        return result;
    },
    set(target, key, value) {
        const result = Reflect.set(target, key, value);
        updateIndexes(target);
        return result;
    }
});

let second = parray[1];
console.log(second.position); // 1
parray.splice(0, 1);
console.log(second.position); // 0

... или сделайте свойство position аксессором, которое ищет объект в массиве и возвращает его текущую позицию, что означает создание аксессора там, где он закрывается массив:

let array = [
    {
        get position() {
            return array.indexOf(this);
        }
    },
    {
        get position() {
            return array.indexOf(this);
        }
    },
    {
        get position() {
            return array.indexOf(this);
        }
    }
];

let second = array[1];
console.log(second.position); // 1
array.splice(0, 1);
console.log(second.position); // 0
...