【问题标题】:Difference of array, result is 1 or undefined数组的差异,结果为 1 或未定义
【发布时间】:2020-05-27 15:06:26
【问题描述】:

Array a = [1,2,3,4,5,5]

Array b = [1,2,3,5]

c = a - b

应该返回c = [4](5 重复了两次,但我不希望它出现在输出中) 现在这是我的代码:

function arrayDiff(a, b) {
  var array = [];
  var diff = [];
  for (var i = 0; i<a.length; i++) {
    array[a[i]] = true;
  }

  for (var i = 0; i<b.length; i++) {
    if (array[b[i]]) {
      delete array[b[i]];
    }
    else {
      array[b[i]] = true;
    }

    for (var k in array) {
      return diff.push(k);
    }

  }

}
Test.describe("Sample tests", function() {
  Test.it("Should pass Sample tests", function() {
    Test.assertDeepEquals(arrayDiff([], [4,5]), [], "a was [], b was [4,5]");
    Test.assertDeepEquals(arrayDiff([3,4], [3]), [4], "a was [3,4], b was [3]");
    Test.assertDeepEquals(arrayDiff([1,8,2], []), [1,8,2], "a was [1,8,2], b was []");
  });
}); 

但它返回奇怪的东西。你能解释一下为什么它返回 1 以及我该如何解决它?这是 console.log 输出:


a was [], b was [4,5] - Expected: [], instead got: 1
a was [3,4], b was [3] - Expected: [4], instead got: 1
a was [1,8,2], b was [] - Expected: [1, 8, 2], instead got: undefined


Unhandled rejection TestError: a was [], b was [4,5] - Expected: [], instead got: 1

你能帮我解决一下吗?

【问题讨论】:

    标签: javascript arrays node.js difference


    【解决方案1】:

    你的代码有几个问题

    1. 嵌套在第二个 for 循环内的第三个 for 循环不应嵌套在第二个循环内。

    2. .push() 方法在数组中添加一个新项,并在添加新项后返回数组的长度。而不是返回push函数的返回值,需要返回diff数组。

    这是固定代码

    const a = [1,2,3,4,5,5];
    const b = [1,2,3,5];
    
    function arrayDiff(a, b) {
      var array = [];
      var diff = [];
      for (var i = 0; i<a.length; i++) {
        array[a[i]] = true;
      }
      
      for (var i = 0; i<b.length; i++) {
        if (array[b[i]]) {
          delete array[b[i]];
        }
        else {
          array[b[i]] = true;
        }
      }
        
      for (var k in array) {
          diff.push(Number(k));
      }
      
      return diff;
      
    }
    
    console.log(arrayDiff(a, b));

    编辑

    根据您的 cmets,如果 a = []b = [1, 2] 则输出应为 [],对于 a = [1, 8, 2]b = [],输出应为 [1, 8 ,2]

    这在您的代码中是不可能的,因为您正在根据数组索引和布尔值找到差异。

    您可以通过过滤数组a并检查数组a中的当前元素是否存在于数组b中来获得所需的输出。

    let a = [1, 8 ,2];
    let b = [];
    
    function arrayDiff(a, b) {
      return a.filter(n => !b.includes(n));
    }
    
    console.log(arrayDiff(a, b));

    【讨论】:

    • 它将它作为一个字符串返回,我该怎么做才能让它返回一个数字。当我尝试你的代码时也有一些错误:``` a 是 [],b 是 [4,5] - 预期:[],而不是:['4','5'] a 是 [3,4 ], b 是 [3] - 预期:[4],而不是:['4'] a 是 [1,8,2],b 是 [] - 预期:[1,8,2],而不是: ['1', '2', '8']```
    • diff.push(k);更改为diff.push(Number(k));
    • 试试a = [],``` b = [1,2]. It returns [1,2]。如果我们在 else 语句中将array[b[i]] 更改为array[a[i]],它会返回[NaN]。也可以试试 wirh a = [1,8,2] b = [],它返回 [1,2,8]
    • 我不确定你想说什么。 a = []b = [1. 2] 时还应该返回什么?
    • 它应该返回c = a - b所以[] - [1,2]应该返回[],[1,8,2]-[]应该返回[1,8,2]而不是它返回[1,2,8]
    【解决方案2】:

    您的代码看起来不错。它可能需要一些修改以使其变得简单。

    function arrayDiff(a, b) {
      return a.filter((aItem) => b.indexOf(aItem) === -1);
    }
    

    【讨论】:

    • 你能解释一下它是如何工作的吗?我不熟悉=&gt;
    • (params) =&gt; exp 表示function(params) { return exp; }。叫做箭头函数
    • filter 数组函数以函数为参数。参数函数必须返回truefalse。所以filter函数返回符合条件的新数组。
    • 好的,我明白了。它看起来像 babel,我用过一点,但我没有使用它。
    • 感谢您的帮助
    【解决方案3】:

    您可以使用Set 并过滤数组。

    function arrayDiff(a, b) {
        const setB = new Set(b);
        return a.filter(v => !setB.has(v));
    }
    
    console.log(arrayDiff([1, 2, 3, 4, 5, 5], [1, 2, 3, 5]));

    【讨论】:

    • 它可以工作,但我需要使用我上面创建的代码之类的函数来运行它
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多