【问题标题】:Find array A in a multidimensional array B using JavaScript使用 JavaScript 在多维数组 B 中查找数组 A
【发布时间】:2018-06-17 10:15:30
【问题描述】:

我需要一种快速的方法来在另一个数组中找到一个数组。

以下示例描述了我的场景:

我需要找到数组 A:

var A = ["A0", "B0", "C0", "D2", "E2", "F0", "G2"];

在数组 B 中(请注意,我的 B 数组可能包含数百万个结果):

B[
["X0", "O0", "I0", "Z2", "T2", "L0", "V2"],
["I0", "V2", "O0", "T0", "L4", "X0", "Z3"],
["A0", "B0", "C0", "D2", "E2", "F0", "G2"],
["Z2", "L7", "T0", "I1", "V3", "X0", "O0"],
["Z3", "I1", "O0", "T3", "X0", "L2", "V2"],
["O0", "X0", "I1", "T2", "V0", "Z3", "L2"],
["I0", "Z0", "L7", "X0", "V3", "O0", "T3"],
["L3", "X0", "I1", "O0", "V0", "Z1", "T1"]
];

是否有一个函数可以为我提供正确或错误的陈述,或者在上述情况下提供实际结果:B[2]

【问题讨论】:

  • 顺序重要吗?里面只有一个吗?你试过什么?
  • 嗨,尼娜,顺序无关紧要。我想要的只是在数组 B 中包含数组 A,而不是复制它。所以这个想法是首先检查 A 没有出现在 B 中。
  • 子数组或查找数组中是否存在重复条目?

标签: javascript arrays search multidimensional-array


【解决方案1】:

如果查找数组中没有重复项,则可以将Array#findIndexArray#everyArray#includes 一起使用。

function getIndex(needle, haystack) {
    return haystack.findIndex(h => needle.every(n => h.includes(n)));
}

var a = ["A0", "B0", "C0", "D2", "E2", "F0", "G2"],
    b = [["X0", "O0", "I0", "Z2", "T2", "L0", "V2"], ["I0", "V2", "O0", "T0", "L4", "X0", "Z3"], ["A0", "B0", "C0", "D2", "E2", "F0", "G2"], ["Z2", "L7", "T0", "I1", "V3", "X0", "O0"], ["Z3", "I1", "O0", "T3", "X0", "L2", "V2"], ["O0", "X0", "I1", "T2", "V0", "Z3", "L2"], ["I0", "Z0", "L7", "X0", "V3", "O0", "T3"], ["L3", "X0", "I1", "O0", "V0", "Z1", "T1"]];
    
console.log(getIndex(a, b));

【讨论】:

  • 这似乎有效...您认为一旦 B 数组变得非常大(数十万或数百万)索引时它会表现良好吗?
  • @jjj,您可以尝试一下,如果速度较慢,您可以使用一些嵌套的 for 循环提前退出。
  • 现在,我决定实现你的方法 Nina,因为另一个推荐的选项是使用 JSON.stringify,我认为这会增加一些复杂性并且可能会减慢结果。再次感谢您。
【解决方案2】:

试试这样的

var result = B.filter(function(bArr){ return bArr.length == A.length && bArr.every(function(ele,index){ return ele==A[index]})})

【讨论】:

    【解决方案3】:

    如果A 中的项目顺序很重要,则使用findJSON.stringify

    var aStr = JSON.stringify( A );
    var doesExists = !!B.find( s => JSON.stringify( s ) == aStr );
    

    演示

    var B = [
    ["X0", "O0", "I0", "Z2", "T2", "L0", "V2"],
    ["I0", "V2", "O0", "T0", "L4", "X0", "Z3"],
    ["A0", "B0", "C0", "D2", "E2", "F0", "G2"],
    ["Z2", "L7", "T0", "I1", "V3", "X0", "O0"],
    ["Z3", "I1", "O0", "T3", "X0", "L2", "V2"],
    ["O0", "X0", "I1", "T2", "V0", "Z3", "L2"],
    ["I0", "Z0", "L7", "X0", "V3", "O0", "T3"],
    ["L3", "X0", "I1", "O0", "V0", "Z1", "T1"]
    ];
    var A = ["A0", "B0", "C0", "D2", "E2", "F0", "G2"];
    
    var aStr = JSON.stringify( A );
    var doesExists = !!B.find( s => JSON.stringify( s ) == aStr );
    
    console.log( doesExists );

    并且如果顺序无关紧要,那么在比较之前首先使用sort

    var fnSort = (a,b) => a.localeCompare( b );
    var aStr = JSON.stringify( A.sort( fnSort ) );
    var doesExists = !!B.find( s => JSON.stringify( s.sort( fnSort ) ) == aStr );
    

    演示

    var B = [
    ["X0", "O0", "I0", "Z2", "T2", "L0", "V2"],
    ["I0", "V2", "O0", "T0", "L4", "X0", "Z3"],
    ["A0", "B0", "C0", "D2", "E2", "F0", "G2"],
    ["Z2", "L7", "T0", "I1", "V3", "X0", "O0"],
    ["Z3", "I1", "O0", "T3", "X0", "L2", "V2"],
    ["O0", "X0", "I1", "T2", "V0", "Z3", "L2"],
    ["I0", "Z0", "L7", "X0", "V3", "O0", "T3"],
    ["L3", "X0", "I1", "O0", "V0", "Z1", "T1"]
    ];
    var A = ["A0", "B0", "C0", "D2", "E2", "F0", "G2"];
    
    var fnSort = (a,b) => a.localeCompare( b );
    var aStr = JSON.stringify( A.sort( fnSort ) );
    var doesExists = !!B.find( s => JSON.stringify( s.sort( fnSort ) ) == aStr );
    
    console.log( doesExists );

    【讨论】:

    • 这很好,但我想知道 JSON.stringify 在 B 数组上的性能,当它包含数百万个索引时。你可以考虑一下吗?
    • @jjj 对于百万以上的索引,除非您在搜索之前准备数据并创建索引,否则大多数方法都会遇到困难。检查的最佳方法是根据您的自己对数据的具体要求。
    • 非常感谢您的帮助。
    【解决方案4】:

    如果数组包含在和其他数组中,您可以使用查找运算符并进行比较,因为数组是您无法直接比较的对象,因为它们是不同的实例,要比较它们,您可以尝试将它们转换为字符串的技巧。 ..

    var A = ["A0", "B0", "C0", "D2", "E2", "F0", "G2"];
    
    var B = [
    ["X0", "O0", "I0", "Z2", "T2", "L0", "V2"],
    ["I0", "V2", "O0", "T0", "L4", "X0", "Z3"],
    ["A0", "B0", "C0", "D2", "E2", "F0", "G2"],
    ["Z2", "L7", "T0", "I1", "V3", "X0", "O0"],
    ["Z3", "I1", "O0", "T3", "X0", "L2", "V2"],
    ["O0", "X0", "I1", "T2", "V0", "Z3", "L2"],
    ["I0", "Z0", "L7", "X0", "V3", "O0", "T3"],
    ["L3", "X0", "I1", "O0", "V0", "Z1", "T1"],
    ["A0", "B0", "C0", "D2", "E2", "F0", "G2"]
    ];
    
    function isIncluded(element) {
      return element.toString() == A.toString();
    }
    
    console.log(B.find(isIncluded)); // 130

    【讨论】:

      猜你喜欢
      • 2015-10-05
      • 2020-04-27
      • 1970-01-01
      • 2021-01-16
      • 2014-05-21
      • 2013-04-12
      • 1970-01-01
      • 2021-05-27
      相关资源
      最近更新 更多