Javascript Массивы внутри объекта - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть массивы внутри объекта, например, вот так:

{1: Array(4), 2: Array(4), 3: Array(4)}
1: (4) ["11111", "2020-04-02", "14:07", 1]
2: (4) ["22222", "2020-04-02", "14:07", 2]
3: (4) ["3333333", "2020-04-02", "14:07", 3]
(from console log)

в моем коде есть возможность добавить массив и удалить массив. И если я удаляю второй массив, например, он станет следующим:

{1: Array(4), 3: Array(4)}
1: (4) ["11111", "2020-04-02", "14:07", 1]
3: (4) ["3333333", "2020-04-02", "14:07", 3]
(from console log)

Как мне сделать третий объект равным 2? Заставьте объект управлять от низкого до высокого СПАСИБО.

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

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

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

Array - упорядоченные элементы с цифровыми индексами Object - неупорядоченные элементы с любыми действительными строковыми или числовыми индексами.

Если это так требуется использовать объект, вот решение, чтобы сделать это вручную -

Для индекса i, который необходимо удалить, проанализируйте следующие индексы (численно больше i) для взять ключ = ключ - 1, то есть уменьшить их индексный ключ на 1.

// index is treated from 1 to n.
const deleteElement = (delete_index, obj) => {
    const keyCount = Object.keys(obj).length;

    // move all elements with keys > delete_index to previous index
    for(let i=delete_index; i<=keyCount; i++) {
        obj[i] = obj[i+1]
    }
    // delete last element
    delete obj[keyCount]
}


0 голосов
/ 02 апреля 2020

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

массив объект в основном нуждается в length свойство и ключи, которые являются положительными целыми числами. Значение length должно быть установлено на еще на , чем самый высокий индекс. Итак, если у вас есть ключи 1, 2, 3, вам нужно length: 4. Да, это немного вводит в заблуждение, поскольку есть только три элемента, но length более точно называется «следующий доступный индекс».

В любом случае, если вы преобразуете свой объект, тогда вы можете использовать Array#splice и установите цель, используя Function#call. Большинство методов массива преднамеренно обобщены c, поэтому они могут работать с любыми массивами:

const obj = {
  1: ["foo"],
  2: ["bar"],
  3: ["baz"],
  length: 4
}

//delete starting from index 2 and remove 1 item
Array.prototype.splice.call(obj, 2, 1)

console.log(obj);

Обратите внимание, как индексы после удаленного смещались, и length также корректировался автоматически.

Если вы не знаете, что такое length в настоящее время, вы можете легко найти его:

const obj = {
  1: ["foo"],
  2: ["bar"],
  3: ["baz"]
}


const keys = Object
  .keys(obj)   //get all keys
  .map(Number) //convert to numbers
  .filter(key => Number.isInteger(key) && key >= 0); //leave only positive integers

//find the highest
const highestKey = keys.reduce((a, b) =>  Math.max(a, b), -1);

//set the length to the next possible index
obj.length = highestKey + 1;

//delete starting from index 2 and remove 1 item
Array.prototype.splice.call(obj, 2, 1)

console.log(obj);
0 голосов
/ 02 апреля 2020

использовать метод сплайсинга arr.splice(2,1), где первый аргумент - индекс, а второй - количество элементов, удаляемых из массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...