检查数组是否原地反转的测试

3

我有一个方法,它被放在数组原型上,用于反转数组(仅用于学习目的)。这个方法应该原地反转数组。

Array.prototype.yarra = function () {
  for (let left=0, right=this.length-1; left<right; left++, right--) {
     [this[left], this[right]] = [this[right], this[left]]
   }
   return this
};

我已经编写了一些测试来检查方法是否按预期工作。

describe('yarra', function () {
  it('should reverse an array in place and return it', function () {
    var arr = [1,2,3];
    var reversedArr = arr.yarra();
    reversedArr.should.eql([3,2,1]);
    arr.should.equal.reversedArr;
    [4,5,6].yarra().should.eql([6,5,4]);
  });
});

我发现测试无法按预期工作,因为我将数组反转并返回了一个新数组,但测试仍然通过了。此外,因为var reversedArr = arr.yarra() 意味着 arr 总是等于 reversedArr,所以它实际上没有检查任何内容。
如何编写一个测试来检查是否原地反转了数组?

为什么不能使用arr.slice().yarra()并进行比较呢?或者我漏掉了什么吗? - ibrahim tanyalcin
@ibowankenobi .slice 会创建一个新的数组,所以无法比较 arr.should.equal.arr.slice().yarra(),这是你想表达的意思吗? - OctaviaLo
我希望你有意地创建一个新的副本,否则反转和旧的将始终是相同的数组,因为它们是相同的对象。因为在你的问题中,你说它并没有真正做任何事情。我能想到的一件事是使用JSON.stringify对它们进行字符串化并比较这些字符串。 - ibrahim tanyalcin
1个回答

1

const assert = require('assert');


Array.prototype.yarra = function () {
    for (let left=0, right=this.length-1; left<right; left++, right--) {
       [this[left], this[right]] = [this[right], this[left]]
     }
     return this
  };

  describe('yarra1', () => {
    it('should reverse an array in place and return it', () => {
      let arr = [1,2,3];
      let rev = [3,2,1];
      let reversedArr = arr.yarra();
      for(let i =0;i<arr.length;i++){
        assert(reversedArr[i]===rev[i])
      }
    });
  });

  describe('yarra2', () => {
    it('should reverse an array in place and return it', () => {
      let arr = [1,2,3];
      let rev = [3,2,1];
      let reversedArr = arr.yarra();
      assert(reversedArr.toString() === rev.toString())
    });
  });


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