Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从对象内部的数组中移除特定对象?(使用pop()或其他解决方案)_Javascript_Arrays_Json_Object - Fatal编程技术网

Javascript 如何从对象内部的数组中移除特定对象?(使用pop()或其他解决方案)

Javascript 如何从对象内部的数组中移除特定对象?(使用pop()或其他解决方案),javascript,arrays,json,object,Javascript,Arrays,Json,Object,我想从myObj的岁月中去掉“hello5” 我使用了“pop”原型,但浏览器控制台返回以下结果: '未捕获的TypeError:无法读取未定义的'type'属性' 下面是我的问题的一个例子。您可以尝试并将从控制台看到错误消息 我尝试了很长时间,但没有找到任何解决方案,我需要你的建议和解决方案 代码: var myObj = { test : 'testObje', langs : { 0 : 'EN', 1 : 'GR', 2 : 'RU', 3 : '

我想从myObj的岁月中去掉“hello5”

我使用了“pop”原型,但浏览器控制台返回以下结果:

'未捕获的TypeError:无法读取未定义的'type'属性'

下面是我的问题的一个例子。您可以尝试并将从控制台看到错误消息

我尝试了很长时间,但没有找到任何解决方案,我需要你的建议和解决方案

代码:

var myObj = {
  test : 'testObje',
  langs : {
    0 : 'EN',
    1 : 'GR',
    2 : 'RU',
    3 : 'TR'
  },
  comment : 'testComment'
};
var years = [];
  for (i= 0; i<=10; i++)
    {
      years.push({
        operator : i,
        type : 'hello' + i
      });
};
myObj.years = years;

var myObjLeng = myObj.years.length;
for(var i = 0; i < myObjLeng; i++) {
    if(myObj.years[i].type == 'hello5') {
        myObj.years.pop();
    }
}
var myObj={
测试:“testObje”,
兰格:{
0:‘恩’,
1:‘GR’,
二:"汝",,
3:‘TR’
},
注释:“testComment”
};
风险值年数=[];
对于(i=0;i这个呢

myObj.years = myObj.years.filter(year => year.type != "hello5")

简言之,您将使用
myObj.years
数组筛选filter回调中名为
year
的每个元素。筛选将通过满足条件的这些元素。除了使用
类型的
“hello5”之外,所有元素都将满足
expression。最后将结果替换回来,就完成了。

pop
始终删除最后一个元素,
pop
对原始数组进行变异,这会影响索引,最终访问超出数组长度的索引,只需使用过滤器即可

let myObj={test:'testObje',langs:{0:'EN',1:'GR',2:'RU',3:'TR'},comment:'testComment'};
让年份=[];
for(让i=0;i键入!=='hello5')

log(myObj)
这里有一些很好的替代方法,所以让我来看看为什么会出现这种错误


您之所以会出现此错误,是因为您正在更改数组中间循环的长度。在循环开始时,您有11个元素,您可以使用它来定义
for
循环将运行多少次。当您到达
hello5
时,您将
pop
最后一个元素,使数组变长10个元素。但是,您的
for
循环仍将尝试访问第11个元素。这将是
未定义的
,当您尝试访问
未定义的
属性时(例如
type
),您将得到一个类型错误。

您的对象键选择错误。我建议您使用
map()
函数代替for循环

var myObj={
测试:“testObje”,
兰格:{
0:‘恩’,
1:‘GR’,
二:"汝",,
3:‘TR’
},
注释:“testComment”
};
风险值年数=[];
对于(i=0;i{
Object.keys(item.map)(i=>myObj.years[key][i]===='hello5'&&(删除myObj.years[key]))
})

console.log(myObj)
pop将删除最后一个元素,这将更改原始数组,这就是为什么会出现“UncaughtTypeError:无法读取未定义的属性'type',因为在pop之后,在数组上找不到您试图访问的索引,而使用“array.filter”

let myObj=
{
测试:“testObje”,
语言:{0:EN',1:GR',2:RU',3:TR'},注释:'testComment'
};
让年份=[];
for(让i=0;i键入!=='hello5')

slice()it,don't pop()it.pop()获取最后一项是的,这里有很好的替代方案。您的评论对于理解错误具有明显的价值。它将帮助那些不理解此错误原因的人。感谢您的评论。我喜欢您的解决方案。谢谢您的帮助:)谢谢你的解释和支持:)谢谢你的解释和支持:)
let myObj =
  {
    test: 'testObje',
    langs: {0: 'EN',1: 'GR',2: 'RU',3: 'TR'},comment: 'testComment'
  };

let years = [];
for (let i = 0; i <= 10; i++) {
  years.push({ operator: i, type: 'hello' + i  });
};

myObj.years = years.filter(({type}) => type !== 'hello5')