【问题标题】:Testing multidimensional arrays in javascript在 javascript 中测试多维数组
【发布时间】:2016-01-28 07:39:41
【问题描述】:

我在 FreeCodeCamp 上解决挑战。下面的代码通过了他们的测试和标记为已解决的挑战,但我自己的测试没有通过,我只是不明白为什么......

function chunk(arr, size) {
    if (size >= arr.length || size <= 0)
        return [arr];
    var result = [];
    var i = 0;
    while(arr.length > 0) {
        result.push([]);
        for (var j = 0; j < size && arr.length > 0; ++j) {
            result[i].push(arr.shift());
        }
        i++;
    }
    return result;
}

alert(chunk(["a", "b", "c", "d"], 2) == [["a", "b"], ["c", "d"]]);

如果我正确理解了 JS 中数组的本质,Alert 应该打印 true,但它打印 false,我不知道为什么?

【问题讨论】:

  • 由于数组是对象,而且对象只有在内存中都指向同一个对象时才相等,因此您不能仅使用== 来检查数组是否相等。您将需要更复杂的平等检查。不过,对于这种简单的情况,比较 JSON.stringify 的结果是可行的。
  • 数组是对象。它们通过引用传递,因此var a = ['a']; var b = ['a']; a==b 将返回 false。
  • JSON.stringify 有效,谢谢@Yoshi!我忘了数组是对象 =(

标签: javascript arrays algorithm


【解决方案1】:

这是有效的:

function chunk(arr, size) {
  if (size >= arr.length || size <= 0)
    return [arr];
  var result = [];
  var i = 0;
  while (arr.length > 0) {
    result.push([]);
    for (var j = 0; j < size && arr.length > 0; ++j) {
      result[i].push(arr.shift());
    }
    i++;
  }
  return result;
}
var array1 = chunk(["a", "b", "c", "d"], 2);
var array2 = [
  ["a", "b"],
  ["c", "d"]
];
var equals = (array1.length == array2.length) && array1.every(function(element, index) {
  return (element.length == array2[index].length) && element.every(function(element1, index1) {
    return element1 === array2[index][index1];
  });
});
alert(equals);

更多信息: How to Compare two Arrays are Equal using Javascript?

【讨论】:

  • 我认为它不起作用,因为这些数组是二维的。如果我的检查正确,请查看我的更正并提供一些反馈? ` var 等于 = (array1.length == array2.length) && array1.every(function(element, index) { return element.every(function(element2, index2) { return element2 == array2[index][index2]; }); });警报(等于); `
  • 是的,谢谢@P。贾伊拉吉!但是如果我们再仔细一点,我认为第二次长度检查应该是这样的: element.length == array2[index].length 因为内部数组可能有不同的长度 =)跨度>
  • Arghhh... 我厌倦了这些评论代码格式... 谁能帮帮我? =) 我已经尝试了所有我认为的变体......
【解决方案2】:

这是最有效的解决方案:

function chunk(arr, size) {
    var output = [];
    var length = arr.length;
    for (var x = 0, length = arr.length; x < length; x = x + size) {
        output.push(arr.slice([x], x + size));
    }
    return output;
}

var array1 = chunk(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M'], 2);

var array2 = [
    ["A", "B"],
    ["C", "D"],
    ["E", "F"],
    ["G", "H"],
    ["J", "K"],
    ["L", "M"]
]

var equals = (array1.length == array2.length) && array1.every(function(element, index) {
  return (element.length == array2[index].length) && element.every(function(element1, index1) {
    return element1 === array2[index][index1];
  });
});
alert(equals);

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2019-06-27
    • 2017-05-24
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多