SL-A-SH Ответов: 2

Перемещение объектов в массиве


У меня есть этот код, где starred_messages является пустым массивом и starred_id это пустой объект.
В функции click я устанавливаю ключ и значение объекта и помещаю его в массив.

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

Вот как выглядит массив в первый раз:

0: {msg_92: "<span class="chat-img pull-left"><img src="http://…on glyphicon-time"></span>26 Dec, 6:18 pm</small>"}



Вот как выглядит массив при втором щелчке мыши:

0: {msg_92: "<span class="chat-img pull-left"><img src="http://…on glyphicon-time"></span>26 Dec, 6:18 pm</small>"}, {msg_10: "<span class="chat-img pull-left"><img src="http://…on glyphicon-time"></span>26 Dec, 6:18 pm</small>"}
 1: {msg_92: "<span class="chat-img pull-left"><img src="http://…on glyphicon-time"></span>26 Dec, 6:18 pm</small>"}, {msg_10: "<span class="chat-img pull-left"><img src="http://…on glyphicon-time"></span>26 Dec, 6:18 pm</small>"}


Обратите внимание, что он добавил второй объект также к 0-му индексу, а 1-й индекс содержит первый объект.

Я хочу добавить объекты по разным индексам.

Что я уже пробовал:

var starred_messages = [];
var starred_id = {};

$(document).on('click', '.star', function () {
   var starred_msg_id = $(this).parent().attr('id');
   var starred_msg = $(this).parent().html();
   starred_id[starred_msg_id] = starred_msg;						
   starred_messages.push(starred_id);
});

2 Ответов

Рейтинг:
2

Patrice T

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

На самом деле за капотом вы нажимаете указатель на объект в массиве.
В следующий раз вы снова нажимаете указатель на тот же объект. А поскольку массив содержит только указатели на 1 объект, любое изменение, внесенное в объект, появляется везде в массиве.

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


Рейтинг:
14

Karthik_Mahalingam

использовать функция как класс[^ объект ] вместо literal object
если вы используете литерал объекта[^] этот value будет переписываться каждый раз, когда одно и то же key есть доступ.

обратитесь к этому примеру;

function clsMsg(id, msg) {
         this.id = id;
         this.msg = msg;
     }

     var starred_messages = [];
     var starred_id = {};
     var starred_msg_id = 1
     var starred_msg = 'one'
     var item1 = new clsMsg(starred_msg_id, starred_msg);
     starred_messages.push(item1);

     var starred_msg_id = 1
     var starred_msg = 'two'
     var item2 = new clsMsg(starred_msg_id, starred_msg);
     starred_messages.push(item2);

     for (var i = 0; i < starred_messages.length; i++) {
         var item = starred_messages[i];

         console.log('id =' + item.id + ",  message =" + item.msg);
         // 1  one
         // 1 two
     }


SL-A-SH

Но это не устанавливает его в качестве пары ключевых значений. Я хочу, чтобы ключ был идентификатором, а значение-msg

Karthik_Mahalingam

Да
Он может быть удален

ВАР starred_messages = [];

Karthik_Mahalingam

Id-это ключ, а msg-это сообщение
Замените идентификатор функции msg на ключ - значение

SL-A-SH

В настоящее время он дает мне такой массив clsMsg {id: "msg_92", msg: "26 декабря, 6:18 вечера"}

Но мне нужно, чтобы это было {msg_92 : "26 декабря, 6:18 вечера"}

Karthik_Mahalingam

это невозможно в буквальном объекте. вы должны использовать 2D массив.

SL-A-SH

Хорошо спасибо

Karthik_Mahalingam

добро пожаловать