Javascript 对象数组:无法读取onchange事件内部未定义的属性“id”

Javascript 对象数组:无法读取onchange事件内部未定义的属性“id”,javascript,jquery,arrays,checkbox,Javascript,Jquery,Arrays,Checkbox,我一直在寻找一种方法,如果id变量等于一个对象的id,那么可以从对象数组中删除单个对象 我使用数组来知道选中了哪些复选框,以便收集相关信息进行进一步处理 例如: 快速选择复选框时出现的错误: Uncaught TypeError: Cannot read property 'id' of undefined at vicerewevi.js:33 at Function.each (jquery-3.1.0.js:368) at HTMLInputElement.<

我一直在寻找一种方法,如果id变量等于一个对象的id,那么可以从对象数组中删除单个对象

我使用数组来知道选中了哪些复选框,以便收集相关信息进行进一步处理

例如:

快速选择复选框时出现的错误:

Uncaught TypeError: Cannot read property 'id' of undefined
    at vicerewevi.js:33
    at Function.each (jquery-3.1.0.js:368)
    at HTMLInputElement.<anonymous> (vicerewevi.js:32)
    at HTMLInputElement.dispatch (jquery-3.1.0.js:5110)
    at HTMLInputElement.elemData.handle (jquery-3.1.0.js:4918)
我在上发现了下面的代码,因此之前从未使用过自定义原型:

Array.prototype.delete = function(pos){
    this[pos] = undefined;
    var len = this.length - 1;
    for(var a = pos;a < this.length - 1;a++){
      this[a] = this[a+1];
    }
    this.pop();
  }
因为您从数组中删除了条目,所以下次对其进行迭代时,您将得到一个未定义的值,用于数组中的特定间隙。显然,它没有id属性

要解决这个问题,不要使用delete,而是使用filter创建一个新的过滤数组,该数组将不会有这样的间隙

替换:

    $.each(jsonobjects, function( index, value ) {
        if (value.id == id ) {
            jsonobjects.delete(index)
        }
    });
…与:

    jsonobjects = jsonobjects.filter(function( value ) {
        return value.id !== id;
    });
或者,如果要坚持使用jQuery方法,请使用$.grep:

因为您从数组中删除了条目,所以下次对其进行迭代时,您将得到一个未定义的值,用于数组中的特定间隙。显然,它没有id属性

要解决这个问题,不要使用delete,而是使用filter创建一个新的过滤数组,该数组将不会有这样的间隙

替换:

    $.each(jsonobjects, function( index, value ) {
        if (value.id == id ) {
            jsonobjects.delete(index)
        }
    });
…与:

    jsonobjects = jsonobjects.filter(function( value ) {
        return value.id !== id;
    });
或者,如果要坚持使用jQuery方法,请使用$.grep:

我一直在寻找一种方法,如果id变量等于一个对象的id,那么可以从对象数组中删除单个对象

常数arr=[ {id:0}, {id:1}, {id:2}, {id:3}, {id:4}, {id:5} ]; const removeById=arr,id=>arr.filtere=>e.id!==身份证件 const no2=移除byidarr,2; const no5=移除byidarr,5; 1.logno2; 控制台logno5; 我一直在寻找一种方法,如果id变量等于一个对象的id,那么可以从对象数组中删除单个对象

常数arr=[ {id:0}, {id:1}, {id:2}, {id:3}, {id:4}, {id:5} ]; const removeById=arr,id=>arr.filtere=>e.id!==身份证件 const no2=移除byidarr,2; const no5=移除byidarr,5; 1.logno2; 控制台logno5 使用Array.filter方法,像这样将JSONObject重新分配给筛选后的数组,而不是您创建的delete方法

jsonObjects=jsonObjects.filtervalue,索引=>{ 返回值.id!==id; } 我希望这有助于

使用Array.filter方法,并像这样将JSONObject重新分配给筛选后的数组,而不是您创建的delete方法

jsonObjects=jsonObjects.filtervalue,索引=>{ 返回值.id!==id; }
我希望这对我有所帮助

当我尝试解决这个问题时,这对我很有效


当我尝试解决这个问题时,这个方法对我有效


您是否尝试过value.getAttributeid==id代替value.id==id?如果它是一个元素?顺便说一句,你可以不用那种奇怪的delete方法,只做jsonobjects.stipleindex,1@JonasW. 谢谢,我还在simple for循环中添加了hasownproperty,而不是$。为了检查数组中的元素是否不是数组函数,您是否尝试过value.getAttributeid==id代替value.id==id?如果它是一个元素?顺便说一句,你可以不用那种奇怪的delete方法,只做jsonobjects.stipleindex,1@JonasW. 谢谢,我还在simple for循环中添加了hasownproperty,而不是$。为了检查数组中的元素是否不是数组函数,如果JSONObject有两个连续的对象,并且都具有要删除的id值,则可以在数组中保留一个条目。在这种情况下,只有两个元素中的第一个将被删除,因为拼接将所有剩余元素向后移动一个索引位置,并且for循环将不会重新访问现在具有下一项的同一索引。例如,请参阅。如果JSONObject有两个连续的对象,并且都具有要删除的id值,则这可能会在数组中留下一个条目。在这种情况下,只有两个元素中的第一个将被删除,因为拼接将所有剩余元素向后移动一个索引位置,并且for循环将不会重新访问现在具有下一项的同一索引。例如,见。
for (var k in jsonobjects){
    if (jsonobjects.hasOwnProperty(k)) {
        if (jsonobjects[k].id == id) {
            jsonobjects.splice(k, 1)
        }
    }
}