【问题标题】:How to split array based on the element in another array如何根据另一个数组中的元素拆分数组
【发布时间】:2018-04-02 11:52:44
【问题描述】:

我有两个数组: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是升序,降序还是随机顺序。对不起,我的英语不好。希望大家能理解。

【问题讨论】:

  • array2unique中的值吗?
  • @ArmanCharan 是的..
  • 如果array1中有多个"2"s:它们应该都是分割点吗?还是只是第一次出现?
  • @ArmanCharan array1 中的值也是唯一的
  • 如果没有排序,时间复杂度会大幅增长

标签: javascript jquery arrays


【解决方案1】:

请参阅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"]

【讨论】:

  • 如果代码(主要是箭头函数)不太简洁且更具可读性,我的首选答案。还是+1。就像它读取if (set.has(value)) 的方式一样。你不能再让JavaScript 像伪代码一样。干得好
【解决方案2】:

试试这个。它循环通过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

【讨论】:

  • 为什么投反对票?评论会很高兴知道可以改进的地方。
  • 我没有对此投反对票,但请注意您的答案是 O(M*N),而 @Arman Charan 的答案只有 O(M)。
  • 这就是 SO 令人沮丧的地方。没有任何内容表明答案、解释或任何需要改进的想法有问题的投反对票。
  • 我不擅长数组我只是想知道你是怎么想出O(M*N)的? @Phrogz
  • 是的。 O(M*N) complexity 是在 for loop 中使用 Array.prototype.includes() 的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
相关资源
最近更新 更多