-1

我正在尝试使用一个使用 For Each 的纯函数,该函数将更改输入数组以返回“x”。有人可以帮我解释为什么我会收到这个错误吗?

功能:

let functions = {
    helper: (x) => {
        return x;
    },

    changeArray: (x) => {
        let arr1 = [x];
        arr1.forEach(functions.helper);
        return arr1[0];
    }
};

测试文件:

test('For Each', () => {
    expect(syntax.changeArray(['hey', 'hi']).toBe(['x','x']));
})

结果/错误:

    TypeError: _syntax.default.changeArray is not a function

      73 | 
      74 | test('For Each', () => {
    > 75 |     expect(syntax.changeArray(['hey', 'hi']).toBe(['x','x']));
         |                   ^
      76 | })

变化:

const syntax{    
    helper: (x) => x,

    changeArray: (arr) => {
        return arr.map(syntax.helper);
    }
}

测试文件:

    test('For Each', () => {
       expect(syntax.changeArray(['hey', 'hi'])).toBe(['x','x']);
    })

结果:

    expect(received).toBe(expected) // Object.is equality

    - Expected
    + Received

      Array [
    -   "x",
    -   "x",
    +   "hey",
    +   "hi",
      ]
4

2 回答 2

0

这有多个问题

主要的是,什么是syntax.changeArray?你的功能在functions.changeArray.

当您通过 运行函数时Array.forEach,该forEach函数实际上不会对返回的值做任何事情。我想你想要的是Array.map

此外,您的辅助函数返回x,而不是'x'- 它将返回给定的任何内容,因此如果您将该辅助函数传递给array.map,它只会返回您发送的相同未更改的值。

这段代码可能会让你知道你应该做什么。

function runMap(arr) {
  return arr.map(val => 'x');
}

var testArray = [1,2,3];
console.log(runMap(testArray));

于 2020-02-26T17:06:16.373 回答
0

为什么我们会看到两个functions和的引用syntax,它们看起来是一样的?让我们坚持一个,并删除另一个。我会syntax在这里使用。

这是一个syntax可以解决您的问题的定义:

let syntax = {

  // This change to the "helper" function solves problem #1;
  // simply return the string 'x' regardless of the parameter
  helper: x => 'x',

  // This "changeArray" function return a new `Array` where
  // every item has been mapped using `syntax.helper` (which
  // will map every Array item to the string 'x'):
  changeArray: arr => arr.map(syntax.helper)

};

修复测试套件中的逻辑错误。改变:

expect(syntax.changeArray(['hey', 'hi']).toBe(['x','x']))

至:

expect(syntax.changeArray(['hey', 'hi'])).toBe(['x','x']);
于 2020-02-26T17:07:52.353 回答