Я смотрел онлайн, чтобы увидеть различные способы удаления записи из объекта и заменить идентификатор записи, удаленной следующей доступной записью, то есть использование оператора delete
в JavaScript не удаляет связанный с ним идентификатор записи. У меня есть объект:
obj= {
0:{},
1:{},
2:{},
3:{}
}
и я хочу удалить запись из этого объекта, я делаю:
delete obj[1]
и он удаляет запись, но когда я console.log(obj)
вижу:
obj= {
0:{},
2:{},
3:{}
}
Я знаю, что одним способом может быть преобразование этого объекта в массив, а затем удалить элемент из массива и преобразовать его обратно в объект. Если мне нужно избежать всего этого преобразования, есть ли способ в объекте JavaScript, когда мы удаляем запись, obj возвращается как следующий, когда мы удаляем запись obj[1]
:
obj= {
0:{},
1:{},
2:{}
}
вместо
obj= {
0:{},
2:{},
3:{}
}
Как уже упоминалось, вы должны преобразовать объект в массив. Вот еще один способ сделать это, используя Array.from
, а затем пусть Array#splice
позаботится об удалении и переиндексировании.
Добавление свойства length
к объекту делает Array.from
обрабатывать значение как объект типа массива, а также гарантирует, что массив "в порядке".
var obj = {
0:{0:0},
1:{1:1},
2:{2:2},
3:{3:3}
};
obj.length = Object.keys(obj).length;
var arr = Array.from(obj);
arr.splice(1,1);
console.log(arr);
Однако, если вам действительно нужен объект, из-за того, как работают методы массива, вы можете применить Array#splice
непосредственно к объекту, если он имеет свойство length
. Эффект заключается в том, что объект мутирован на месте:
var obj = {
0:{0:0},
1:{1:1},
2:{2:2},
3:{3:3}
};
obj.length = Object.keys(obj).length;
Array.prototype.splice.call(obj, 1, 1);
console.log(obj);
// optionally: delete obj.length
Единственный способ, которым я могу думать об этом без сопоставления массиву, - это скопировать все свойства объекта вниз и удалить последний элемент.
var myObject = {
0: {org: 0},
1: {org: 1},
2: {org: 2},
3: {org: 3}
}
const removeIndex = (index, obj) => {
var size = Object.keys(obj).length
if (index<size-1) {
for (let i = index; i<size-1; i++) {
obj[i] = obj[i+1];
}
}
delete obj[size-1]
}
removeIndex(1, myObject)
console.log(myObject)
Но на самом деле вы НЕ должны использовать объект, чтобы действовать как индекс в массиве. Я бы исправил сервер, если вы не можете этого сделать, я бы привязал его к массиву при загрузке страницы и использовал его таким образом. Если сервер нуждается в нем, верните его обратно к этому странному объекту.
Если у вас большой объект, это удаление займет некоторое время, а в массиве оно будет быстрым с помощью сплайсинга.
Как упоминалось выше, нет. Но быстрый способ его преобразования может быть
let Array=Object.keys(obj).map(x=>{
return obj[x]});
console.log(array);
let array = Object.values(obj)
obj= {
0:{a: 1},
1:{b: 2},
2:{c: 5},
3:{d: 10}
}
const deleteElement = (index, obj) => {
delete obj[index];
return Object.keys(obj).reduce((agg, ele, i) => {
agg[i] = obj[ele];
return agg;
}, {});
}
console.log(deleteElement(2, obj))
Есть ли способ?
Нет автоматически, вам нужно выполнить некоторую логику (например, преобразование, о котором вы говорили).