【问题标题】:Find Symmetric difference of multi-dimensional and a single-dimensional arrays查找多维和一维数组的对称差
【发布时间】:2021-02-02 01:13:56
【问题描述】:

我需要一些帮助来查找多维数组和简单数组的对称差异。多维数组单元格的每个内部数组中的第一个值是与简单数组进行比较的索引。

所以

array1 = [1,4,6,7]
array2 = [[1,"more",12],[8,"some",12]]

结果应该是这样的:

compare(array1, array2) = //[4,6,7] // there are three differences when compared this way
compare(array2, array1) = //[8,"some",12] // there is only one difference when compared this way

我需要以与前导数组相同的格式返回一个数组,该数组既具有 array1 与 array2 的差异,又具有 array2 与 array1 的差异。

理想情况下,这些不会覆盖现有数组,而是使用输出结果创建一个新数组。除了这两种数组格式之外,不会有其他数组格式。 如果有帮助,每个比较都可以使用不同的功能。您不必对两者都使用相同的功能,但如果可以,那就太好了。

我尝试了一些循环比较的排列 也在这里找到解决方案 How to get the difference between two arrays of objects in JavaScript 以及这里的简单数组方法 How to get the difference between two arrays in JavaScript?

但我只是没有成功。有人可以帮我一把,并解释他们的解决方案吗?只要其广泛跨浏览器兼容,任何现代工具都可以。我所有的其他代码都坚持使用 ES6,所以这将是理想的。如果想出一个单一的解决方案,请解释发生了什么,以便我学习。

谢谢!

更新@Dave,这对我来说很有意义,但在失败后我开始尝试上面帖子中的不同过滤方法和其他技术,但没有太大成功。

let newNurkles = new Array();
        for(var i = 0; i < nurkles.length; i++){
            if(this.activeNurkles.includes(nurkles[i])){
            } else {
                newNurkles.push(nurkles[i]);// if not then push to array
            }
        }
        console.warn("Nurkles to Add" + newNurkles);

【问题讨论】:

  • 到目前为止你得到了什么?不过,可能需要重新编写原始问题陈述,使其看起来不像是直接来自您的家庭作业/面试问题。
  • 我早已过了做作业的年龄。让 newNurkles = new Array(); for(var i = 0; i
  • 家庭作业或编码问题没有年龄限制 :) 区分的标准不是很清楚,特别是在比较 array2 和 array1 的示例中(至少我还不太明白)。
  • this. 的作用是什么?您是否显示部分代码并将我们引导到逻辑错误的位置? ...你问一个问题然后引导问题出在哪里?但是,既然你问了这个问题,你怎么知道它在哪里? ....一堆反问:显示所有或更多代码。因为您所展示的内容本身缺乏识别逻辑错误的能力。

标签: javascript arrays multidimensional-array


【解决方案1】:

这显示了如何对两个数组执行析取联合,一个是单维数组,另一个是多维数组。

对称性是由 single 中的每个元素与 multi 中每个子数组的第一个元素确定的。多重只会是一层深度。

用途:Array.prototype.map()Array.prototype.filter()

步骤:

  1. 映射到第一个输入数组
  2. 对于每个元素,过滤第二个输入以排除在第一个输入中找到的那些
  3. 将结果限制为仅返回的第一个数组

注意事项:

  • oarray1 的迭代
  • tarray2 的迭代
  • t[0] 代表匹配key
  • t[idx]代表被迭代子数组的当前值
  • array2 的结果将生成一个多维数组

const array1 = [1, 4, 6, 7];
const  array2 = [[1, "more", 12],[8, "some", 12], [7, 3, 9], [2, 7, 5, 4], [4, 3]];

const oneToTwo = array2.map((t, idx) => array1.filter(o => t[idx] !== o))[0]

const twoToOne  = array1.map(o => array2.filter(t => o !== t[0]))[0]

console.log(oneToTwo);
console.log(twoToOne)

【讨论】:

  • 这将需要一段时间来消化,我可能会再次评论更多问题,但积分是值得的。我真的不明白 o => t[idx] !== o 是如何被过滤器理解的。为什么不只是 t[idx] !== o。我不明白 o => 在这种情况下实际上在做什么。
  • 这是一个arrow function。它是function(o){ ... } 的替代品(以及其他详细信息)
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多