如何根据另一个数组中的元素来拆分数组

6

我有两个数组: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"]

但现在我面临的问题是array1的元素可能不按顺序排列。例如:["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是按升序、降序还是随机顺序排列呢?抱歉我的英语不好,希望你们能理解。

array2 中的值是否是 unique 的? - Arman Charan
@ArmanCharan 是的.. - Xion
如果在array1中有多个“2”,它们都应该作为分割点吗?还是只考虑第一次出现的? - Arman Charan
@ArmanCharan,array1内部的值也是唯一的。 - Xion
如果不按顺序排序,时间复杂度将会大幅增加。 - vol7ron
2个回答

9
请参阅更多信息,有关于 SetArray.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。我喜欢它的阅读方式 if (set.has(value))..你不能让JavaScript看起来更像伪代码了。做得好。 - vol7ron

1
尝试这个。它循环遍历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来迭代数组,因为它不以任何特定顺序返回索引。更多信息在这里


1
我没有给这个回答点踩,但请注意你的答案是O(M*N),而@Arman Charan的答案只有O(M)。 - Phrogz
1
这就是 Stack Overflow 令人沮丧的地方。没有任何建议说明回答有问题,解释不清或者对如何改进没有任何想法,却给出了负分评价。 - vol7ron
我不擅长数组,我只是想知道你是如何得出 O(M*N) 的?@Phrogz - guradio
谢谢@Phrogz。如果有Array.reduceSet.has,那么它仍然算作O(M)吗? - H77
2
是的。O(M*N) 复杂度是由于在一个for循环中使用了 Array.prototype.includes() 而导致的。 - Arman Charan
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接