Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Добавление элементов в массив (https://javascript.ru/forum/events/81441-dobavlenie-ehlementov-v-massiv.html)

alex_wm 27.11.2020 11:25

Добавление элементов в массив
 
Привет, подскажите, будьте любезны)
Хочу добавлять элементы в массив при каждом клике, при этом чтобы к элементу автоматически подставлялся ключ 1, 2, 3..

var arr = {};
var id = 1;
$('button').click(function() {
    var item = {};
    item['name'] = 'имя';
    item['image'] = 'изображение';
    arr = {id: item};
    id++;
});


Такая конструкция не срабатывает. Строится массив вида:

id:{name:имя, image: изображение}

а элементы не добавляются, а перезаписываются. Переменная массива id в массиве не читается как переменная. Заранее спасибо.

laimas 27.11.2020 11:46

arr = {[id]: item};

alex_wm 27.11.2020 12:17

Большое спасибо :dance: :dance: :dance:

alex_wm 27.11.2020 12:29

Еще вопрос, хочу данный массив записать в local storage. Как вычислять последний ключ массива для того чтобы добавлять уникальное значение ключа?

var arr = {};
if(!isEmpty(localStorage.getItem('arr')) {
    var id = 1;
} else {
    // var id = ???
}
$('button').click(function() {
    var item = {};
    item['name'] = 'имя';
    item['image'] = 'изображение';
    arr = {[id]: item};
    localStorage.setItem('arr', JSON.stringify(arr));
    id++;
});

alex_wm 27.11.2020 12:41

И еще - элемент новый не добавляется а перезаписывается

laimas 27.11.2020 12:45

Math.max(...Object.keys(JSON.parse(localStorage.getItem('arr'))))+1


А как добавлять, если arr = {} всегда?

laimas 27.11.2020 13:35

Цитата:

Сообщение от alex_wm
не добавляется а перезаписывается

arr = {[id]: item};

arr[id] = item;

alex_wm 27.11.2020 14:05

Цитата:

Сообщение от laimas (Сообщение 531207)
arr = {[id]: item};

arr[id] = item;

Такая конструкция не работает
Выдает ошибку
Uncaught TypeError: Cannot set property '2' of null

laimas 27.11.2020 14:12

<button>Add</button>
<pre></pre>
<script>
var arr = {}, id = 0;

document.querySelector('button').addEventListener('click', function() {
    var item = {time: Date.now()}
    arr[++id] = item;
    document.querySelector('pre').textContent = JSON.stringify(arr, null, '\t')
});
</script>


Работает? Что-то вы не так делаете.

alex_wm 27.11.2020 14:50

Цитата:

Сообщение от laimas (Сообщение 531209)
[HTML run]<button>Add</button>
arr[++id] = item;

Я понял, такая конструкция работает только когда массив не пуст. Когда пуст - соответственно выдает ошибку

laimas 27.11.2020 14:57

Цитата:

Сообщение от alex_wm
Я понял, такая конструкция работает только когда массив не пуст. Когда пуст - соответственно выдает ошибку

А у меня разве он изначально полон? И это не массив, а объект.

А вот у вас работать будет в любом случае не так как ожидается. Не так ли должно быть:

если в локальном хранилище имеется сохраненный объект, то arr равен декодированной записи из хранилища, а id максимальному значению его ключа, иначе ara = {}, id = 0?

рони 27.11.2020 15:21

alex_wm,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

</head>

<body>
<button>Add</button>
<pre></pre>
<script>
var arr = localStorage.arr;
arr = arr ? JSON.parse(arr) : [];
function addArr()
{
    var item = {};
    item['name'] = 'имя';
    item['image'] = 'изображение';
    arr.push(item); 
    showArr();
}
function showArr()
{
  var jsonArr = JSON.stringify(arr, null, '\t');
  document.querySelector('pre').textContent = localStorage.arr = jsonArr
}
showArr()
document.querySelector('button').addEventListener('click', addArr);
</script>


</body>
</html>

alex_wm 27.11.2020 16:51

laimas, огромное вам спасибо, сделал как вы, просто местами условия поменяли. Все работает, супер!!!


Часовой пояс GMT +3, время: 09:34.