【问题标题】:Is there a way to delete a record in JavaScript while maintaining its order and sequence of numbers有没有办法在 JavaScript 中删除记录,同时保持其顺序和数字序列
【发布时间】:2018-10-17 23:04:14
【问题描述】:

我在网上查看了从对象中删除记录并将删除的记录的 id 替换为下一条可用记录的各种方法,这意味着 JavaScript 中 delete 运算符的使用不会删除关联的记录 id用它。说我有一个对象:

obj= {
0:{},
1:{},
2:{},
3:{}
}

我想从该对象中删除一条记录,我这样做了:

delete obj[1]

它会删除记录但是当我console.log(obj) 我明白了:

obj= {
0:{},
2:{},
3:{}
}

我知道一种方法是将此对象转换为数组,然后从数组中删除元素并将其转换回对象。如果我必须避免所有这些转换,当我们删除记录时,JavaScript 对象中有没有办法,当我们删除 obj[1] 记录时,obj 返回如下:

obj= {
    0:{},
    1:{},
    2:{}
    }

改为

obj= {
    0:{},
    2:{},
    3:{}
    }

【问题讨论】:

  • 对象没有顺序。为什么不使用数组?
  • @epascarello:这就是我从服务器获取数据的方式,我没有以数组格式获取数据
  • 似乎是一个缺陷,并且由于对象没有顺序,因此无法轻松遍历您删除的属性之后的属性。所以真的你唯一的选择是做某种循环转换。
  • 对象也没有数字键。您的对象也可能是{ "0":{}, "1":{}, "2":{}, "3":{} }
  • 您应该考虑在使用它之前立即将从服务器接收到的数据转换为数组。您目前正在尝试将类似数组的逻辑应用于不能像数组一样操作的东西。除了键名之外,0: {}zero: {} 之间实际上没有区别。键名不是索引器

标签: javascript


【解决方案1】:

obj= {
  0:{a: 1},
  1:{b: 2},
  2:{c: 5},
  3:{d: 10}
}

const deleteElement = (index, obj) => {
    delete obj[index];
    return Object.keys(obj).reduce((agg, ele, i) => {
      agg[i] = obj[ele];
      return agg;
    }, {});
}

console.log(deleteElement(2, obj))

【讨论】:

    【解决方案2】:

    正如其他人所提到的,您应该将对象转换为数组。这是另一种方法,通过Array.from,然后让Array#splice 负责删除和重新索引。

    向对象添加length 属性使Array.from 将值视为类数组 对象,它还保证数组是“有序”的。

    var obj = {
      0:{0:0},
      1:{1:1},
      2:{2:2},
      3:{3:3}
    };
    obj.length = Object.keys(obj).length;
       
    var arr = Array.from(obj);
    arr.splice(1,1);
    console.log(arr);

    但是,如果您真的需要一个对象,由于数组方法的工作原理,您可以将Array#splice 直接应用于该对象,只要它具有length 属性即可。效果是对象原地变异:

    var obj = {
      0:{0:0},
      1:{1:1},
      2:{2:2},
      3:{3:3}
    };
    obj.length = Object.keys(obj).length;
       
    Array.prototype.splice.call(obj, 1, 1);
    console.log(obj);
    // optionally: delete obj.length

    【讨论】:

      【解决方案3】:

      如前所述,没有。但转换它的快速方法可能是

      let Array=Object.keys(obj).map(x=>{
      return obj[x]});
      console.log(array);
      

      【讨论】:

      • 短:let array = Object.values(obj)
      【解决方案4】:

      在不映射到数组的情况下,我唯一能想到的方法是将对象中的所有属性向下复制并删除最后一项。

      var myObject = {
        0: {org: 0},
        1: {org: 1},
        2: {org: 2},
        3: {org: 3}
      }
      
      
      const removeIndex = (index, obj) => {
         var size = Object.keys(obj).length
         if (index<size-1) {
           for (let i = index; i<size-1; i++) {
             obj[i] = obj[i+1];       
           }
         }
         delete obj[size-1]   
      }
      
      
      removeIndex(1, myObject)
      console.log(myObject)

      但实际上,您不应该使用 Object 来充当 Array 上的索引。我会修复服务器,如果你不能这样做,我会在页面加载时将它映射到一个数组并以这种方式使用它。如果服务器需要它,请将其映射回这个奇怪的对象。

      如果你有一个大对象,这个删除会需要一段时间,而在一个数组中,拼接会很快。

      【讨论】:

      • 是的,这对我不起作用,但正如您所建议的,将它映射到数组对我来说似乎是一个理想的解决方案,因为我不处理服务器修改。
      • 对象大小可能从长度= 4 到长度= 20 左右不等,我敢肯定这会变得很麻烦
      【解决方案5】:

      有办法吗?

      不自动,你需要执行一些逻辑(比如你谈到的转换)。

      【讨论】:

        最近更新 更多