Javascript数组返回是添加双引号?

时间:2015-12-08 18:26:36

标签: javascript arrays for-loop

这是我的代码:

function iLoveThree (array) {
  var threes = [];
  var x;
  for (x in array) {
    if (x % 3 == 0) {
      threes.push(x)
    }
  }
  return threes
}

当我传递数组[1,2,3,4,5,6,7,8,9]时,我得到以下内容:

Function returned 
["0","3","6"]
instead of 
[3,6,9]

我的问题是,这些双引号来自何处?

8 个答案:

答案 0 :(得分:2)

for...in是一种迭代数组索引的坏方法。更好地使用filter

[1,2,3,4,5,6,7,8,9].filter(function(x) {
  return x % 3 == 0;
}); // [3, 6, 9]

答案 1 :(得分:0)

所以基本上在x in array x中的索引不是数组值。因为无论如何0不在数组中,但你的函数也返回它。您应该使用array[x]

访问这些值

有各种方法,其中一种方法是使用.filter

function iLoveThree(array){
    return array.filter(function(x){
        return (x%3==0?1:0);
    });
}

或者

function iLoveThree (array) {
  var threes = [];
  var x;
  [].forEach.call(array, function(x){
    if (x % 3 == 0) {
      threes.push(x)
    }
  }
  return threes
}

答案 2 :(得分:0)

您正在使用for..in循环,该循环为您提供对象中的键,或者在这种情况下和数组中。键总是字符串。相反,您希望使用标准的for循环。

for (var i = 0; i < array.length; i++) {
  var x = array[i];
  if (x % 3 === 0) {
    threes.push(x);
  }
}

或者,如果您想使用功能更强大的方法,可以使用Array.prototype.filter

return array.filter(function(x) {
  return x % 3 === 0;
});

答案 3 :(得分:0)

for..in循环循环遍历数组元素,它循环遍历数组的索引。所以:

var arr = ["a", "b", "c"]
for ( x in arr ) console.log( x );

您将获得["0", "1", "2"]

的字符串键

您可以通过将循环替换为本机for循环来修复代码:

for ( var x = 0; x < array.length; x++ ) {
    if (array[i] % 3 == 0)
        threes.push(array[i]);
}

答案 4 :(得分:0)

您似乎正在推动索引而不是实际值,请继续尝试以下操作:

function iLoveThree(array) {
    var threes = [];
    var x;
    for (x in array) {
        if (((x-2) % 3) == 0) {
            threes.push(array[x])
        }
    }
    return threes;
}

另一个选项,更短,是:

function iLoveThree(arr) {
    var threes = [];
    for (var i = 2; i < arr.length; i = i + 3) {
        threes.push(arr[i]);
    };
    return threes;
}

如果您对基于回调/谓词的循环感到满意,可以通过过滤数组来缩短内容,而不是创建新的数组:

function iLoveThree(arr) {
    return arr.filter(function(x) {
        return (x % 3) == 0;
    });
}

答案 5 :(得分:0)

不是直接回答你的问题,但这是一个从数组中拉出3的每个倍数的好方法:

[1,2,3,4,5,6,7,8,9].filter(item => item % 3 === 0)

答案 6 :(得分:0)

在您阅读以下答案之前,请阅读:Why is using “for…in” with array iteration such a bad idea?(感谢@Oriol提供此链接。)

道格拉斯·克罗克福德也不鼓励使用for..in。他建议改为使用array.forEach

&#13;
&#13;
function iLoveThree (array) {
  var threes = [];

  array.forEach(function(item, i){  // use forEach, 'item' is the actual value and 'i' is the index
    if (item % 3 === 0) {
      threes.push(item); // you missed ; here
    }
  });

  return threes;  // you missed ; here
}

console.log(iLoveThree([1,2,3,4,5,6,7,8,9]));
&#13;
&#13;
&#13;

阅读:Array.prototype.forEach() | MDN

答案 7 :(得分:-1)

如果你阅读了for...in文档,就会发现你正在推动threes 索引(也称为)而不是,因为变量x代表索引,因此值应由array[x]访问。

function iLoveThree (array) {
  var threes = [];

  for (var x in array) {
    if (array[x] % 3 == 0) {
      threes.push(array[x])
    }
  }
  return threes
}

有几种方法可以实现这一点,最好的方法是使用filter,但这种方式已由其他人解释,因此我将使用reduce

[1, 2, 3, 4, 5, 6, 7, 8, 9].reduce(function(acc, e){return e % 3 == 0 ? acc.concat(e) : acc}, [])

输出3, 6, 9