Как создать динамический идентификатор для объекта JavaScript при вставке нового элемента?

У меня есть массив элементов объекта JavaScript внутри. Вот пример:

var contacts =[{"id":1,"first":"Mike","last":"Johnson","email":"mjohnson@gmail.com","phone":"(203) 567-9055","status":1},{"id":2,"first":"John","last":"Dunn","email":"jdunn@gmail.com","phone":"(319) 451-7889","status":1},{"id":3,"first":"Lisa","last":"Morgan","email":"lmorgan@gmail.com","phone":"(508) 233-8908","status":1},{"id":4,"first":"Dave","last":"Hart","email":"dhart@gmail.com","phone":"(509) 874-9411","status":1}];

Я должен вставить / обновить записи в этом массиве. Я не уверен, что будет лучшим подходом, чтобы проверить, существует ли запись в этом массиве. Если существует, обновите объект js, если не создайте новый id, В идеале этот идентификатор должен быть целым числом и начинается после самого высокого текущего идентификатора в объекте js. Таким образом, в данных выше самое высокое значение id 4, Если я вставлю новую запись id для новой записи должно быть 5, Есть ли хороший способ добиться этого с помощью JavaScript?

function saveContact(){
    var frmObject = $(this),
        frmKey = $("#frm_id").val(),
        formData = frmObject.serialize(),
        contactRecord = contacts.find(item => item.id === Number(frmKey));;

        if (contactRecord) {
            contacts[frmKey] = getJSON(frmObject.serializeArray()); // If already exist in array then update object
        }else{
            frmKey = 'generate new id';
            contacts[frmKey] = getJSON(frmObject.serializeArray()); // If doesn't exist generate new key and insert object in array 
        }
}

5 ответов

Решение

Это было упомянуто в комментарии, но я немного уточню это.

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

Например:

var contacts =[{"id":1,"first":"Mike","last":"Johnson","email":"mjohnson@gmail.com","phone":"(203) 567-9055","status":1},{"id":2,"first":"John","last":"Dunn","email":"jdunn@gmail.com","phone":"(319) 451-7889","status":1},{"id":3,"first":"Lisa","last":"Morgan","email":"lmorgan@gmail.com","phone":"(508) 233-8908","status":1},{"id":4,"first":"Dave","last":"Hart","email":"dhart@gmail.com","phone":"(509) 874-9411","status":1}];

// just a quick dirty conversion
let obj = contacts.reduce((a, c) => (a[c.id] = c, a), {})

//Object looks like:
console.log(obj)

// find the largest key // maybe a good way to decide the next key
largest_id = Math.max(...Object.keys(obj))
console.log("largest ID", largest_id)

// is ID 4 taken?
console.log("is there a 4", 4 in obj) //yes
// alternatively obj.hasOwnProperty('4')

// is 5?
console.log("is there a 5", 5 in obj) //no

// update ID 4:
obj['4'].first = "Mark"
console.log(obj['4'])

Надеюсь, это немного стимул попробовать этот подход вместо массива.

Найдите последний объект в массиве и получите его идентификатор:

contacts[contacts.length-1].id

Тогда просто добавь 1 и у вас есть следующий идентификационный номер.

Вы можете использовать Object хранить ваши Collection of Objects, Каждый раз, когда объект вводится в коллекцию, генерируется новый идентификатор (на основе длины коллекции), если id объекта, вставленного в коллекцию, уже существует, он только выполняет обновление.

const collection = {};

function insert(obj){
   // if id is set in object and object is already in Collection... 
   if(obj.id && collection.hasOwnProperty(obj.id) ){ 
     // Update object!
     collection[obj.id]= Object.assign(collection[ obj.id], obj) ;
   }else{ 
     // if provided object has no ID... generate it!
     if( !obj.id ) obj.id = Object.keys(collection).length;
     // insert provided object to collection;
     collection[obj.id]= obj;
   }
   // return generaed id;
   return obj.id;
}


// Let's test...

let obj_1 ={"first":"Mike","last":"Johnson","email":"mjohnson@gmail.com","phone":"(203) 567-9055","status":1};

let obj_2 = {"first":"John","last":"Dunn","email":"jdunn@gmail.com","phone":"(319) 451-7889","status":1};

// insert bth object
insert(obj_1);
insert(obj_2);
// perform a change in object 2
obj_2.first ='Joseph';
// insert object 2 again...
insert(obj_2);
// object 2 has been updated, and all have unique ids
console.log(collection);

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

Вы можете хранить все json в базе данных, во время выборки просто взять количество элементов массива / Id последнего элемента и установить его в счетчике.

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

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

var contacts  = {

   
  1: {
    first: "Mike",
    last: "Johnson",    
    email:"mjohnson@gmail.com",
    phone:"(203) 567-9055",
    status:"1"
 },
  2: {
    first: "John",
    last: "Dunn",    
    email:"jdunn@gmail.com",
    phone:"(319) 451-7889",
    status:"1"
 },
  3: {
    first: "Lisa",
    last: "Morgan",    
    email:"lmorgan@gmail.com",
    phone:"(508) 233-8908",
    status:"1"
 },
  4: {
    first: "Dave",
    last: "Hart",    
    email:"dhart@gmail.com",
    phone:"(509) 874-9411",
    status:"1"
 }
};

var frmKey = 5;
if(contacts[frmKey]){
console.log(contacts[frmKey]);
 // If already exist in array then update object
}else{
  contacts[frmKey] = {first: "Lisa1",last: "Morgan1", email:"lmorgan1@gmail.com", phone:"(508) 233-8908", status:"1" };

  console.log("Added New Key::"+frmKey,contacts[frmKey]);

}

Другие вопросы по тегам