Javascript没有像预期的那样迭代

Javascript没有像预期的那样迭代,javascript,Javascript,有人能告诉我为什么我的JS没有遍历循环并删除数组中不是“10”的项吗 据我所知,它应该检查数组中的每个项目,删除任何不是10的项目,然后返回剩余的项目“10” 我当前的输出是:[,10,50,10] 我已经看到一些答案,它们创建一个单独的数组,并将10的项推送到数组中,然后返回10,但是为什么我的代码不起作用呢 函数getElementsThatEqual10AtProperty(obj,key){ if(obj.key.length==0){ 返回[]; }如果(!obj.hasOwnPro

有人能告诉我为什么我的JS没有遍历循环并删除数组中不是“10”的项吗

据我所知,它应该检查数组中的每个项目,删除任何不是10的项目,然后返回剩余的项目“10”

我当前的输出是:
[,10,50,10]

我已经看到一些答案,它们创建一个单独的数组,并将10的项推送到数组中,然后返回10,但是为什么我的代码不起作用呢

函数getElementsThatEqual10AtProperty(obj,key){
if(obj.key.length==0){
返回[];
}如果(!obj.hasOwnProperty(键)){
返回[];
}否则{
对于(变量i=0;i控制台日志(输出)这是一种奇怪的方法设计。它会变异并返回结果?一般来说,最好做一个或另一个(请参阅)

另外,原始方法与对象结构过度耦合。最好让它只在数组上运行,而不使用任意对象键

考虑以下几点:

函数getElementsThatEqual10(数组){ 返回array.filter(n=>n==10); } var obj={ 钥匙:[1000,10,50,10] }; var输出=getElementsThatEqual10(对象键);
控制台日志(输出)您可以这样编写来删除正确的项,因为您在for循环中返回,所以只删除了第一个项

可以使用“拼接”方法而不是“删除”,因为“删除”只删除参照,而不删除阵列的位置

函数getElementsThatEqual10AtProperty(obj,key){
if(obj[key].length==0){
返回[];
}如果(!obj.hasOwnProperty(键)){
返回[];
}否则{
对于(变量i=0;i控制台日志(输出)早期返回仅在删除第一个元素后中断循环(此处简化为简单数组,因为对象不相关):

让objKey=[1000,10,50,10];
for(var i=0;i
您可以将
return
语句从循环中移到
getElementsThatEqual10AtProperty
函数结束之前

其他人已经提出了更优雅的方法。

您的代码有什么问题 主要问题是,您正在从循环中执行
返回
,这意味着在第一次迭代中,当函数到达该行时,它将完全退出

第二个问题更像是一个建议,但我不建议使用
delete
。删除对象属性时,
delete
不会更新数组的
长度
或索引

var数组=[1,2,3,4];
删除数组[0];

console.log(array.length)为什么代码不起作用

  • 您的
    return
    语句在for循环中,因此如果
    条件失败,它将在
    条件失败时立即返回控制
  • 您正在使用
    delete
    ,它将删除该元素,但其他元素的索引仍将与以前相同。所以你会得到类似于[undefined,10,undefined,10]的结果
下面是代码的工作模式。

函数getElementsThatEqual10AtProperty(obj,key){
if(obj.key.length==0){
返回[];
}如果(!obj.hasOwnProperty(键)){
返回[];
}否则{
设温度=[]
对于(变量i=0;i备选方案
如果您对另一种方法持开放态度,您可以尝试使用
filter
,来解析您要查找的值:

const getElementsThatEqual10AtProperty=(obj,key)=>obj[key]。过滤器(v=>v==10)
var obj={
钥匙:[1000,10,50,10]
};
var输出=getElementsThatEqual10AtProperty(obj,'键');

控制台日志(输出)
难道你不能直接执行obj.key=obj.key.filter(n=>n==10)
?虽然我知道你在问为什么你的不起作用,而不仅仅是要求一个替代方案。你按照你的问题返回内部for循环,这是你不想做的,不仅是你在@CodeManiac提到的第一次迭代后返回,你还在使用
delete
,它不会重新索引或更新数组长度-它只会删除对象属性。虽然这并没有给我答案,但它确实消除了一个错误。谢谢尽管我知道有一种更干净的方法来编写它,但这不是我要问的。我仍在学习代码的功能,因为是的,我正在变异并返回以查看结果和代码正在做什么。祝您旅途好运。我希望你很快就会明白。@caffinekitten这个答案是错误的。如果给定值[1000,10,50,10]被更改为两个连续的非10值,它将返回这些非10数字中的至少一个。虽然
splice
方法是正确的,但是可能有更好的答案来描述代码中不会产生错误结果的其他问题
let objKey = [1000, 10, 50, 10];

for (var i = 0; i < objKey.length; i++) {
  if (objKey[i] !== 10) {
    // Here it deletes 1000, the first element
    delete objKey[i];
  }
  // then it returns [undefined, 10, 50, 10]
  return objKey;
}