删除后减少 JSON 数组中的 ID

Posted

技术标签:

【中文标题】删除后减少 JSON 数组中的 ID【英文标题】:Decrement ID in JSON array after deletion 【发布时间】:2017-07-10 21:12:30 【问题描述】:

我的本​​地存储中存储了一个数组。它是动态的。我将数据与一个 ID 一起存储,该 ID 在每次输入后都会递增。用户可以选择删除,因此,我应该从数组中删除相应的元素。但是,我希望 ID 保持升序。例如:

var jsonObj = ['id':'1','name':'Ray','email':'ray@gmail.com',  
               'id':'2','name':'Steve','email':'steve@gmail.com',
               'id':'3','name':'Albert','email':'albert@gmail.com',
               'id':'4','name':'Christopher','email':'chris@gmail.com']

我正在为上述数组创建 html div。万一史蒂夫删除了他的详细信息,我希望数组如下:

var jsonObj = ["id":1,"name":"Ray","email":"ray@gmail.com",  
               "id":2,"name":"Albert","email":'albert@gmail.com",
               "id":3,"name":"Christopher","email":"chris@gmail.com"]

以下代码不能相应地工作。

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

【问题讨论】:

***.com/questions/8310270/… 【参考方案1】:

您可以从给定的索引进行迭代并减少 id 属性。

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


var array = [ id: '1', name: 'Ray', email :'ray@gmail.com',  id: '2', name: 'Steve', email: 'steve@gmail.com' ,  id: '3', name: 'Albert', email: 'albert@gmail.com' ,  id: '4', name: 'Christopher', email: 'chris@gmail.com' ];

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

【讨论】:

【参考方案2】:

如果你从0开始,那么你甚至不需要ID

Ray 是第 0 个元素,Christopher 是第 3 个元素

删除 Albert 和 Christopher 是第二个

var jsObj = ['name':'Ray','email':'ray@gmail.com',  
             'name':'Steve','email':'steve@gmail.com',
             'name':'Albert','email':'albert@gmail.com',
             'name':'Christopher','email':'chris@gmail.com']
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

【讨论】:

我做了完全相同的事情,但我确实为用户提供了一个编辑选项,用户可以在其中编辑任何详细信息。元素之间的唯一性丢失了,我被命令使用 ID。感谢您的回复先生。 您可以在循环中将 id 显示为 (i+1)【参考方案3】:

您只需在 for 循环中声明一个新变量,然后将其递增,然后将此值分配为它们的 id

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

var jsonObj = ['id':'1','name':'Ray','email':'ray@gmail.com',  
               'id':'2','name':'Steve','email':'steve@gmail.com',
               'id':'3','name':'Albert','email':'albert@gmail.com',
               'id':'4','name':'Christopher','email':'chris@gmail.com'];


console.log(jsonObj);

jsonObj.splice(1, 1);


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


console.log(jsonObj);

【讨论】:

【参考方案4】:

一个非常简单的方法可能是:

// 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 基本上与数组索引相对应。因此,与其尝试重新计算 id,我们可以用相应的索引覆盖它(+1,因为你从 1 开始,而不是像数组索引那样从 0 开始)。

【讨论】:

【参考方案5】:

根据您的要求,您必须在 javascript 中使用 splice 方法

array.splice(index_you_wantto_delete,count)

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

splice() 方法在数组中添加/删除项目,

【讨论】:

问题是不要删除。这是另外一回事。无论如何感谢您的帮助:)【参考方案6】:

这是一个详细的解决方案,逐步解释该过程

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;
;

【讨论】:

【参考方案7】:

试试下面的方法。希望它有效!

// 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;

【讨论】:

【参考方案8】:

你可以在纯js中使用map来做

const jsonObj = [
    'name': 'Ray',
    'email': 'ray@gmail.com'
  ,
  
    'name': 'Steve',
    'email': 'steve@gmail.com'
  ,
  
    'name': 'Albert',
    'email': 'albert@gmail.com'
  ,
  
    'name': 'Christopher',
    'email': 'chris@gmail.com'
  
];

jsonObj.splice(1, 1);

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

console.log(newObj);

【讨论】:

【参考方案9】:

获取删除的索引并将其分配给for循环的i

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

【讨论】:

以上是关于删除后减少 JSON 数组中的 ID的主要内容,如果未能解决你的问题,请参考以下文章

从数组中的 JSON 对象中删除属性 [重复]

使用 jQuery 按值删除 JSON 数组中的元素

js,求大神指导 怎么删除数组型json里不符合条件的元素

json数组的删除。

如何从 Spring Boot 中的 JSON 数组中删除元素? [关闭]

从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]