1

我正在尝试创建一个数组数组,这些数组根据它们的长度(字符串)进行分组,如下面的数组:

var testA = ["carts","carts","cars","cars","ca","ca", "ca","a","a","a","a"];

会成为:

var sortedArrays = [["carts","carts"], ["cars","cars"],["ca","ca","ca"], ["a","a","a","a"]]

我目前正在尝试下面的循环,但根本无法让它工作。我知道这将是一件简单的事情,但我花了很长时间试图完成这件事,但事实证明这非常令人沮丧。

 var testA = ["carts","carts","cars","cars","ca","ca", "ca","a","a","a","a"];
 var sortedArrays = [];

 for(i=0; i < testA.length; i++){
     longestWord = 0;
     wordHolder = []
     wordHolder.push(testA[i])    

 if (testA[i].length > longestWord){
     longestWord = testA[i].length
     wordHolder.push(testA[i])
 }
 sortedArrays.push(wordHolder)

 }

任何帮助将不胜感激

4

2 回答 2

1

坚持使用 java 脚本,我能够做到以下几点。我的假设是单词已经按长度降序排序,并且每个长度只有一个单词。那是基于你在做什么。我认为发生的事情是每次循环都被初始化或重置太多。

var testA = ["carts", "carts", "cars", "cars", "ca", "ca", "ca", "a", "a", "a", "a"];
var sortedArrays = [];
var wordHolder = []; // took outside loop to ensure initialized
var curLength = testA[0].length;// assuming here that testA not empty
for (var i = 0; i < testA.length; i++) {
  if (testA[i].length === curLength) { // more of the same
    wordHolder.push(testA[i]);
  } else { // new block starts
    curLength = testA[i].length;
    sortedArrays.push(wordHolder);
    // alert (wordHolder)
    // alert (sortedArrays)
    wordHolder = [];
    wordHolder.push(testA[i]);
  }
}
sortedArrays.push(wordHolder);// add the last one
于 2020-02-12T13:25:46.940 回答
1

下面的代码怎么样(Swift,但用其他语言重新编写它应该很容易):

let testA = ["carts","carts","cars","cars","ca","ca", "ca","a","a","a","a"]
var maxLength = 0
for string in testA {
    if string.count > maxLength { maxLength = string.count }
}
var sortedArrays: [[String]] = []
for nextLength in 0 ... maxLength {
    let invertedLength = maxLength - nextLength
    let nextArray = testA.filter { $0.count == invertedLength }
    sortedArrays.append(nextArray)
}

此代码还创建空数组,当然可以轻松跳过。

当然,问题是您的要求是什么。上面的代码比较紧凑,但是对于大数组来说速度不是很快……
对于大数组,最好先对testA进行排序,然后再提取元素。

于 2020-02-12T12:35:51.830 回答