代码之家  ›  专栏  ›  技术社区  ›  Xion

如何基于另一个数组中的元素拆分数组

  •  6
  • Xion  · 技术社区  · 7 年前

    我有两个数组:array1和array2。因此,array1将根据array2内部的元素进行拆分。例如:

    array1["1","2","3","4","5","6"]
    array2["2","5"]
    

    我的代码:

    var prev = 0;
    newArray = []; 
    for (var ii in array2) {
        var index = array1.indexOf(array2[ii]);
    
        if (index != prev) {
            newArray.push(array1.slice(prev, index));
            prev = index;
        }
     }
     newArray.push(array1.slice(prev));
    

    结果将是:

    ["1"],["2","3","4"],["5","6"]
    

    但现在我面临的问题是数组1的元素不能有序。例如: ["1","5","3","4","2","6"] 。因此,根据我的代码,它将错误地拆分array1,因为array2中的第一个元素是“2”,所以它已经将array1拆分为两个 ["1","5","3","4"],["2","6"] 。接下来,当谈到“5”时,它找不到它。

    预期结果是: ["1"],["5","3","4"],["2","6"]

    那么,如何在array2的基础上拆分array1,无论array1是按升序、降序还是随机顺序。对不起,我的英语不好。希望你们能理解。

    2 回复  |  直到 7 年前
        1
  •  9
  •   Arman Charan    7 年前

    看见 Set Array.prototype.reduce() 了解更多信息。

    // Split Up.
    const splitup = (array, keys) => (set => array.reduce((output, value) => {
      if (set.has(value)) output.push([value]) // Split.
      else output[output.length-1].push(value) // Append.
      return output
    }, [[]]))(new Set(keys))
    
    // Output.
    const output1 = splitup(["1","2","3","4","5","6"], ["2","5"])
    console.log(...output1) // ["1"],["2","3","4"],["5","6"]
    const output2 = splitup(["1","5","3","4","2","6"], ["2","5"])
    console.log(...output2) // ["1"],["5","3","4"],["2","6"]
        2
  •  1
  •   H77    7 年前

    试试这个。它循环通过 array1 并将每个项目推送到临时数组中。在中找到项目时 array2 临时数组被推入最终数组,然后重置。

    var array1 = ["1", "5", "3", "4", "2", "6"];
    var array2 = ["2", "5"];
    
    var newArray = [];
    var currArray = [];
    
    for (let i = 0; i < array1.length; i++) {
    
      // Item exists in array2. Add to newArray and reset currArray
      if (i > 0 && array2.includes(array1[i])) {
        newArray.push(currArray);
        currArray = [];
      }
    
      currArray.push(array1[i]);
    }
    
    newArray.push(currArray); // Add final currArray to newArray
    
    console.log(newArray); // print result

    另一方面,最好不要使用 for..in 如果索引顺序很重要(如您的情况),则遍历数组,因为它不会以任何特定顺序返回索引。更多信息 here