Javascript:为什么我的array.filter不注册推送的值?

时间:2019-01-28 04:45:39

标签: javascript arrays

我有一个数组,我想使用.filter来计算其中每个值的数量,但是我的函数似乎忽略了另一个函数pushed的任何值。

我的代码看起来像这样:

var arrToCheck = []

var ones =  arrToCheck.filter(function(x) { return x == 1; })
var twos = arrToCheck.filter(function(x) { return x == 2; })
var threes = arrToCheck.filter(function(x) { return x == 3; })

function checkLength(input) {
  length = input.length
  switch (length) {
    case 1:
      arrToCheck.push(1)
      break;
    case 2:
      arrToCheck.push(2)
      break;
    case 3:
      arrToCheck.push(3)
      break;
    default:
      console.log ("length too long")
   }
}

例如,如果输入为[A,I,TO,BUT,THE,SHE],则

arrToCheck应该返回[1, 1, 2, 3, 3, 3] ones应该返回[1, 1]

但是,当我进行测试时,尽管arrToCheck返回的值包括预期的推入值,但是ones数组将为空。

.filter函数似乎可以正常工作,因为当我在源代码的arrToCheck数组中输入值时,.filter函数会注册这些值。它只是忽略由checkLength开关推动的任何1。

我也曾尝试在不同的地方将1的值从字符串更改为数字,但是这并没有起到什么作用(与预期的一样)。

因此,似乎各个位都在工作,但它们不能一起工作?我想念什么吗?

(还有一个额外的问题,当array.filter函数返回错误“ TRUE不是函数”时,我做错了什么?)

5 个答案:

答案 0 :(得分:1)

解决方案的问题是您没有将字符串长度放入arrToCheck数组中。这就是您可能想要得到的(在代码下面使用arrow functions

var input=["A", "I", "TO", "BUT", "THE", "SHE"]

var arrToCheck = input.map(x=>x.length);

var ones =  arrToCheck.filter(x => x == 1)
var twos = arrToCheck.filter(x => x == 2)
var threes = arrToCheck.filter(x => x == 3)

// show results
j=JSON.stringify;
console.log('arrToCheck',j(arrToCheck));
console.log('ones',j(ones));
console.log('twos',j(twos));
console.log('threes',j(threes));

答案 1 :(得分:0)

.filter并不是在数组上持续运行的不可思议的事物,它只是在数组上执行一次就已执行。每次要过滤内容时,您都需要运行.filter

答案 2 :(得分:0)

您只需要致电这些行

var ones =  arrToCheck.filter(function(x) { return x == 1; })
var twos = arrToCheck.filter(function(x) { return x == 2; })
var threes = arrToCheck.filter(function(x) { return x == 3; })

初始化arrToCheck数组后。

var arrToCheck = []

function checkLength(input) {
  length = input.length
  switch (length) {
    case 1:
      arrToCheck.push(1)
      break;
    case 2:
      arrToCheck.push(2)
      break;
    case 3:
      arrToCheck.push(3)
      break;
    default:
      console.log ("length too long")
   }
}

['A', 'I', 'TO', 'BUT', 'THE', 'SHE'].forEach(x=>checkLength(x))
var ones =  arrToCheck.filter(function(x) { return x == 1; })
var twos = arrToCheck.filter(function(x) { return x == 2; })
var threes = arrToCheck.filter(function(x) { return x == 3; })
console.log(ones)

答案 3 :(得分:0)

在编写的checkLength()函数中,您的input.length指的是您要传入的数组的长度-而不是数组内部字符串的长度。

允许我建议对checkLength进行稍微修改的版本:

function checkLength(input) {
  console.log(`input is ${input}`);
  console.log(`input.length is ${input}`);
  length = input.length
  switch (length) {
    case 1:
      arrToCheck.push(1)
      break;
    case 2:
      arrToCheck.push(2)
      break;
    case 3:
      arrToCheck.push(3)
      break;
    default:
      console.log (`unexpected length: ${length}`)
   }
}

如果您这样做并运行

const input = ['A', 'I', 'TO', 'BUT', 'THE', 'SHE'];
checkLength(input);

您将看到有用的调试信息:

input is A,I,TO,BUT,THE,SHE
input.length is A,I,TO,BUT,THE,SHE
unexpected length: 6

希望能帮助您摆脱困境。

如有疑问,请添加一些console.logs()来验证您的理解,或提供有关代码与您的意图不同之处的见识。

答案 4 :(得分:0)

您需要在新输入到达时更新数组,我已经将此更新过程包装在一个函数上,并在将新输入推入arrToCheck之后调用了该更新过程。另外,我还简化了switch ... case块使用的逻辑。

var arrToCheck = [];
var ones = [], twos = [], threes = [];

function updateFilters()
{
    ones = arrToCheck.filter(function(x) { return x == 1; });
    twos = arrToCheck.filter(function(x) { return x == 2; });
    threes = arrToCheck.filter(function(x) { return x == 3; });
}

function checkLength(input)
{
    length = input.length;

    if (length && length <= 3)
        arrToCheck.push(length);
    else
        console.log ("length too long")

    updateFilters();
}

// Main code:

checkLength("AA");
checkLength("AAA");
checkLength("AAAA");
checkLength("A");

console.log(
    JSON.stringify(ones),
    JSON.stringify(twos),
    JSON.stringify(threes)
);

checkLength("AA");
checkLength("AAA")

console.log(
    JSON.stringify(ones),
    JSON.stringify(twos),
    JSON.stringify(threes)
);