Javascript findIndex不是一个函数。

17

我有一个json数组:

[    
  {"id":19,"name":"Jed", "lastname":"DIAZ", "hobby":"photo", "birthday":"2011/11/22"},
  {"id":20,"name":"Judith", "lastname":"HENDERSON", "hobby":"pets", "birthday":"1974/06/12"},
  {"id":21,"name":"Nicolai", "lastname":"GRAHAM", "hobby":"reading", "birthday":"2005/01/22"},
  {"id":22,"name":"Vasile", "lastname":"BRYANT", "hobby":"singing", "birthday":"1987/03/17"}
]

从JSON数组中删除项目的函数

 removeItem: function(removeId){
   //paramater validation
   return dataLoad.then(function(data){

     f = data.findIndex(function(item) { return item.id == removeId; });

     if(f < 0)
       return false;
     data.splice(f,1);

     LS.setData(data,"cutomers");

     return true;
   });
 }

代码运行时出现错误:

findIndex不是一个函数

错误行

 f = data.findIndex(function(item) { return item.id == removeId; });

4
也许你应该更新问题的标题,因为问题正文没有提到 indexof - Some programmer dude
1
在那行代码之前,你有执行过 console.log(data) 吗?更具体地说,你能确认 data 是一个 Array 吗? - Sebastian Simon
你能分享整个代码吗?信息不足。 - Evgeny Shmanev
Joachim Pileborg,感谢您的标题:)。我没有使用console.log(data)。 - Gigi
3个回答

22
findIndex不是ArrayECMASCRIPT 262的一个原型方法,你可以尝试使用filter结合indexOf替代,它能够优势在于找到匹配项后停止搜索。
var f;
var filteredElements = data.filter(function(item, index) { f = index; return item.id == removeId; });


if (!filteredElements.length) {
    return false;
}

data.splice(f, 1);

参考评论中 Nina Scholz 的建议进行编辑:

这个解决方案使用了Array.prototype.some

var f;
var found = data.some(function(item, index) { f = index; return item.id == removeId; });

if (!found) {
    return false;
}

data.splice(f, 1);

Array.prototype.findIndex MDN 中找到。

输入图像描述


建议使用Array.prototype.some,因为它在找到结果后就会停止迭代,而不是使用过滤器。 - Nina Scholz
同意,我会相应地更新我的答案。 - axelduch
你的回答给人的印象是 filter 在找到匹配项后会停止迭代。但事实并非如此 - 对于 some 是正确的。 - ankr

6
我认为你会在你自己的标题中找到答案;你可能正在寻找indexOf,而不是findIndex。findIndex是ECMAScript2015的一部分,目前并没有得到广泛支持。
根据MDN的说法,findIndex仅在Firefox 25+和Safari 7.1+中得到支持,因此如果你在其他浏览器中进行测试,你会遇到错误。
在MDN页面上有一个建议使用的polyfill,如果你想今天就使用findIndex,可以使用它。

如果您想今天使用findIndex,MDN页面上有一个建议的polyfill可供使用。这很有帮助!谢谢! - jsruok
不幸的是,polyfill 在 IE 11 中返回索引字符串。 - Ian Yates

1
您可以使用 Polyfill 来解决 IE 不支持 Array.prototype.findIndex() 的问题。
我已经测试过了,它对我有效。 MDN 提供了这个 Polyfill。
希望能够帮到您!

————————

编辑:

MDN已删除polyfill部分。

我建议在您的项目中添加core-js进行polyfill。 Core-js


你链接的页面将其列在数组的标准内置对象下。 - Joel G Mathew

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