2017-02-21 17 views
2

У меня есть массив, хранящийся в моем локальном хранилище. Это динамично. Я сохраняю данные вместе с идентификатором, который увеличивается после каждой записи. У пользователя есть возможность удаления, поэтому я должен удалить соответствующий элемент из массива. Но я хочу, чтобы ID оставался в порядке возрастания. Пример:Идентификатор Decrement в массиве JSON после удаления

var jsonObj = [{'id':'1','name':'Ray','email':'[email protected]'}, 
       {'id':'2','name':'Steve','email':'[email protected]'}, 
       {'id':'3','name':'Albert','email':'[email protected]'}, 
       {'id':'4','name':'Christopher','email':'[email protected]'}] 

Я создаю HTML-div для указанного массива. В случае, если Стив удалит свои данные, я хочу, чтобы массив был следующим:

var jsonObj = [{"id":1,"name":"Ray","email":"[email protected]"}, 
       {"id":2,"name":"Albert","email":'[email protected]"}, 
       {"id":3,"name":"Christopher","email":"[email protected]"}] 

Следующий код не работает должным образом.

for (var i=0; i<jsonObj.length; i++) { 
    //delete function is working fine. 
    jsonObj[i].id--; 
    break; 
    } 
+0

http://stackoverflow.com/questions/8310270/reindex-javascript-array-object-after- remove-a-key – mplungjan

ответ

1

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

for (var i=0, id=1; i<jsonObj.length; i++, id++) { 

var jsonObj = [{'id':'1','name':'Ray','email':'[email protected]'}, 
 
       {'id':'2','name':'Steve','email':'[email protected]'}, 
 
       {'id':'3','name':'Albert','email':'[email protected]'}, 
 
       {'id':'4','name':'Christopher','email':'[email protected]'}]; 
 

 

 
console.log(jsonObj); 
 

 
jsonObj.splice(1, 1); 
 

 

 
for (var i=0, id=1; i<jsonObj.length; i++, id++) { 
 
\t jsonObj[i].id = id; 
 
} 
 

 
console.log(jsonObj);

1

очень упрощенный подход может быть:

// the index of the deleted element 
const delIndex = 2; 

// reindex all entries starting from deleted one 
for (var i=delIndex+1; i<jsonObj.length; i++) { 
    jsonObj[i].id = i + 1; 
} 

Идентификатор в основном соответствует индексу массива в любом случае. Поэтому вместо того, чтобы пытаться вычислить id заново, мы можем просто перезаписать его соответствующим индексом (+1, когда вы начинаете с одного и не нулевого, как индексы массива).

0

Получить удаленный индекс и присвоить его i значения для контура

for (var i=deletedIndex; i<jsonObj.length; i++) { 
     jsonObj[i].id--; 
    } 
3

Вы можете просто перебирать из данного индекса и уменьшает id свойства.

function deleteItem(i) { 
 
    array.splice(i, 1); 
 
    while (i < array.length) { 
 
     array[i].id--; 
 
     i++; 
 
    } 
 
} 
 

 
var array = [{ id: '1', name: 'Ray', email :'[email protected]'}, { id: '2', name: 'Steve', email: '[email protected]' }, { id: '3', name: 'Albert', email: '[email protected]' }, { id: '4', name: 'Christopher', email: '[email protected]' }]; 
 

 
deleteItem(1); 
 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

Если отталкиваться от 0, то вам не нужно даже идентификатор

Ray является 0th элемент, Кристофер третий

удалять Альберт и Кристофер второй

var jsObj = [{'name':'Ray','email':'[email protected]'}, 
 
      {'name':'Steve','email':'[email protected]'}, 
 
      {'name':'Albert','email':'[email protected]'}, 
 
      {'name':'Christopher','email':'[email protected]'}] 
 
for (var i=0;i<jsObj.length;i++) { 
 
    document.write("<br>ID"+(i+1)+": "+jsObj[i].name) 
 
} 
 
document.write("<hr/>"); 
 
jsObj.splice(2, 1); // Bye bye Albert 
 
for (var i=0;i<jsObj.length;i++) { 
 
    document.write("<br>ID"+(i+1)+": "+jsObj[i].name) 
 
}

Дополнительная информация

Reindex javascript array/object after removing a key

+0

Я сделал то же самое, но у меня есть опция редактирования для пользователей, где пользователь может редактировать любую из деталей. Уникальность среди элементов была потеряна, и мне приказали использовать идентификатор. Спасибо за ваш ответ. – Venky

+0

вы можете ПОКАЗАТЬ идентификатор как (i + 1) в цикле – mplungjan

+0

Я последую за этим – Venky

1

для ваших требований вы должны использовать метод сращивания в JavaScript

метод
array.splice(index_you_wantto_delete,count) 

ex:-jsonObj.splice(1,1); 

Сращивание() добавляет/удаляет элементы в/из массива,

+0

Проблема не в том, чтобы удалить. Это нечто другое. В любом случае спасибо за вашу помощь :) – Venky

1

Вот многословным решение, описывающую процесс шаг за шагом

1- Удалить элемент

2 - Обновление индексов, если элемент был найден и удален

/** 
* 
* @param array list Your list 
* @param int elementID The id of the element you want to remove 
* @returns list The list with the element removed and the indexes rearanged 
*/ 
var deleteElement = function (list, elementID) { 
    var removedIndex = false; 
    for (var index = 0; index < list.length; index++) { 
     if (list[index]['id'] === elementID) { 
      list.slice(index, 1); 
      removedIndex = index; 
      break; 
     } 
    } 
    if (removedIndex !== false) { 
     //Get last id 
     var lastElement = (removedIndex === 0) ? null : list[removedIndex - 1]; 
     // Set to 0 if the first element was removed 
     var lastID = (lastElement === null) ? 0 : lastElement.id; 
     for (var i = removedIndex; i < list.length; i++) { 
      list[i].id = ++lastID; 
     } 
    } 
    return list; 
}; 
0

Воспользуйтесь нижеописанным. Надеюсь, что это работает !!

// index of the deleted item 
var itemDeleted = 2; 

// create a for loop from deleted index till last 
for (var i = itemDeleted-1; i < jsonObj.length; i++) { 
    jsonObj[i].id = i+1; 
} 
1

Вы можете сделать в чистом JS, используя карту

const jsonObj = [{ 
 
    'name': 'Ray', 
 
    'email': '[email protected]' 
 
    }, 
 
    { 
 
    'name': 'Steve', 
 
    'email': '[email protected]' 
 
    }, 
 
    { 
 
    'name': 'Albert', 
 
    'email': '[email protected]' 
 
    }, 
 
    { 
 
    'name': 'Christopher', 
 
    'email': '[email protected]' 
 
    } 
 
]; 
 

 
jsonObj.splice(1, 1); 
 

 
const newObj = jsonObj.map((c, i) => ({ 
 
    name: c.name, 
 
    email: c.email, 
 
    id: i + 1 
 
})); 
 

 
console.log(newObj);