使用数组值从Javascript关联数组中删除元素

5

我正在尝试使用值来查找Javascript关联数组中的元素并将其删除,但我遇到了麻烦。我已经尝试了splice和JQuery的grep方法,但都没有成功。这是我目前拥有的内容。

var array_path = new Array();

function bulk_upload(){

var temp_array = new Object();

for (var i = 1; i<8; i++){

        temp_array[i] = $('#path' + i).val();

        if(temp_array[i]!='' && temp_array[i]!=null){

            array_path['path' + i] = $('#path' + i).val();

        }

}
process_txt();
}

function process_txt(){

//alert(array_path.indexOf(full_path)); //returns nothing

var removed_element = array_path.splice(getKey(array_path), 1);

//array_path = $.grep(array_path, function(val) { return val != full_path; });

alert(removed_element);//return nothing, just blank alert box

}

function getKey(data) {
  for (var prop in data)
    return prop;
}

"array_path = new Array();" 这种写法是最糟糕的,应该使用 "array_path = []"。 - Valentin Golev
抱歉,getKey是我自己的函数。我现在已经添加了它。 - Abs
@Valya - 你想详细说明一下吗?这会解决我的问题吗? - Abs
@Abs,就像这样,您的getKey函数总是返回第一个键。这是否是该函数应该执行的操作? - Miguel Ventura
你的代码出了严重的问题:你不能使用数组方法处理非数字“键”,因为这些是普通对象属性;另外,为什么引入 temp_array(其实根本不是个数组),如果你只访问单个值?你为什么要将最多 8 个元素推送到一个数组中(至少我认为你是想这样做的),但只处理其中的一个元素呢? - Christoph
显示剩余3条评论
5个回答

12

实现此操作的方法是使用delete运算符。

delete array_path[getKey(array_path)]

一些背景信息

在JavaScript中,几乎所有的东西都是从Object.prototype继承而来的。JavaScript是一种开放和动态的语言,允许您通过简单的赋值创建/修改对象的属性。这与关联数组非常相似--一种包含键值对的结构。

在底层,数组只是一个从Array.prototype继承而来的带有数字键和一个名为length的特殊属性的对象。 length属性返回的是最高数字属性加1的值。实质上,Array是具有不同语义的对象。

如果您想要一个关联数组,那么Array不是您想要继承的对象。您应该直接从Object继承。有两种方法可以做到这一点,您可以使用new运算符或一个空对象字面量。以下是两种方法的语法:

var o = new Object();
var o = {};

第二个更好,因为它更加简洁。
我之前写过一篇博客文章,如果你想要更多信息可以看一下。

8
在JavaScript中,本质上并不存在所谓的“关联数组”这一概念。对应于此概念的数据结构实际上就是一个JavaScript对象。
当然,JavaScript数组(就像JavaScript中的几乎所有东西一样)也是一个对象,但它具有额外的功能。因此,您可以将数组用作键值映射,但这并不是正确的数据结构。
要从对象中删除一个键,您只需执行以下操作:
var myObj = {};
var myKey = "blah";

myObj[myKey] = 1234; // Adds or updates value for "blah" to 1234.

delete myObj[myKey]; // Removes key-value pair for "blah".

2

你尝试过使用delete hash.someKey;吗?


1
您可以为您的对象添加一个remove方法,或者使用apply或call来使用另一个对象定义的remove方法。
function myObj(members){
 for(var p in members) this[p]= members[p];
}

myObj.prototype.remove= function(val){
 for(var p in this){
  if(this[p]=== val) delete this[p];
 }
 return this;
}

myObj.prototype.toString= function(){
 var  A= [];;
 for(var p in this){
  if(this.hasOwnProperty(p)){
   A.push(p+':'+this[p])
  }
 }
 return '{'+A.join(', ')+'}';
}

var O= new myObj({a: 1, b: 10, c: 100});
alert(O)
O.remove(10);
alert(O)

0

我不是通灵者,所以我只能猜测你想要完成类似这样的事情:

var paths = [];

function getPaths() {
    for(var i = 1; i < 8; ++i) {
        var value = $('#path' + i).val();
        if(value) paths.push(value);
    }
}

function process() {
    var firstPath = paths.shift();
    // do stuff
}

getPaths();
if(paths.length) process();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接