【问题标题】:Associate Array splice does not work关联数组拼接不起作用
【发布时间】:2014-03-20 17:01:00
【问题描述】:

我试图理解为什么在 nodejs 数组 splice 中不能在关联数组上工作。

var a = [];

a['x1'] = 234234;
a['x2'] = 565464;

console.log("Init-------");
showIt();

a.splice(0, 1);
console.log("After splice-------");
showIt();

delete a['x1'];
console.log("After delete-------");
showIt();

function showIt(){
    var keys = Object.keys(a);
    var len  = keys.length;
    var i=0;
    while (i < len) {
        console.log( '    ' + i +  ' ------------ ' + keys[i] );
        i++;
    }
}

结果:

Init-------
        0 ------------ x1
        1 ------------ x2
After splice-------
        0 ------------ x1
        1 ------------ x2
After delete-------
        0 ------------ x2

拼接数组什么都不做……

在浏览器中的结果相同...

更新:

当数组定义为:

var a = ['x1','x2','x3'];
console.log("Init-------");
console.log(a);

a.splice('x1', 1);
console.log("After splice-------");
console.log(a);

看起来在第一个示例中,该数组被视为在第二个示例中被定义为对象{},它被视为更像一个数组。

致版主:

这并不是一个关于备用阵列的问题,它更多的是一个从 0 开始并在几天内按顺序增长到 1000 万个的阵列的问题。随着数组的增长,数组被删除,因此一次数组中有大约 1000 个项目。

我正在考虑通过使用非数字键或定义为对象{} 来强制使用哈希表,以便它像稀疏数组一样工作。

最后,我不确定这是否重要......

【问题讨论】:

  • splice 适用于arraysarray-like 对象,在第一个示例中,它完全符合预期as per spec 在第二个示例中,您是delet从一个对象(数组仍然是一个对象)
  • 我开始看到了。你看到稀疏数组的问题了吗?
  • 个人没有,但是为什么你的数组是稀疏的,你是如何创建它们的?
  • 当然,使用带有属性的真正Object 并使用delete 删除它们也没有错。
  • 感谢您的帮助,我想我要把它们设为 var connections={} 的对象,然后使用 delete。

标签: javascript node.js array-splice


【解决方案1】:

在 JavaScript 中没有关联数组之类的东西——有数组(像其他语言中的普通数组)和对象(像其他语言中的 assoc. 数组)。在您的示例中,a 是一个普通数组,但您在其上设置了非数字键,因此普通数组方法(如拼接)看不到它。它们只在0...a.length 范围内查找。

使a 成为一个对象将无济于事;无法拼接对象。尝试仅使用数字键([1] 而不是 ['x1'])。

【讨论】:

  • splice 确实改变了数组然后返回An array containing the removed elements. If only one element is removed, an array of one element is returned. If no elements are removed, an empty array is returned.
  • 不是 100% 准确... 使用数字键,拼接的结果是一个数组,其中包含已删除的内容,原始数组已发生突变...已更改...已减少。使用非数字键,数组被视为对象。
  • 另外,我不想在这种情况下使用数字键...另一种可能性是一个非常稀疏的数字数组。
  • sparse 数组有什么问题?当然,您可以编写自己的splice,它适用于使用您的索引方法的对象,即x#
  • 我不知道,我在空间数组和字符串键控数组中挣扎。每个都使浏览器使用哈希映射函数,并且每个都弄乱了长度属性。我不知道哪个更好:) 至于我自己的拼接功能,delete array[key] 运行良好。
猜你喜欢
  • 2018-06-24
  • 2011-12-31
  • 2017-12-13
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多