Есть ли способ удалить запись в JavaScript при сохранении ее порядка и последовательности чисел

1

Я смотрел онлайн, чтобы увидеть различные способы удаления записи из объекта и заменить идентификатор записи, удаленной следующей доступной записью, то есть использование оператора 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:{}
    }
  • 4
    Объекты не имеют порядка. Почему вы не используете массив?
  • 0
    @epascarello: так я получаю данные с сервера, я не получаю их в формате массива
Показать ещё 7 комментариев
Теги:

5 ответов

1
Лучший ответ

Как уже упоминалось, вы должны преобразовать объект в массив. Вот еще один способ сделать это, используя 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
1

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

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)

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

Если у вас большой объект, это удаление займет некоторое время, а в массиве оно будет быстрым с помощью сплайсинга.

  • 0
    да, это не сработало бы для меня, но, как вы и предлагали, отображение его в массив выглядит для меня идеальным решением, так как я не имею дело с модификациями сервера.
  • 0
    Почему бы это не сработало?
Показать ещё 1 комментарий
1

Как упоминалось выше, нет. Но быстрый способ его преобразования может быть

let Array=Object.keys(obj).map(x=>{
return obj[x]});
console.log(array);
  • 0
    Короче: let array = Object.values(obj)
1

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))
0

Есть ли способ?

Нет автоматически, вам нужно выполнить некоторую логику (например, преобразование, о котором вы говорили).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню