【问题标题】:Regroup specific items in an array重新组合数组中的特定项目
【发布时间】:2020-03-08 16:20:40
【问题描述】:

这个周末我一直在寻找一种方法来重新组合数组中的项目,但没有成功。我一直在研究 reduce() 方法,将连续的数字重新组合到一个数组中,尽管它需要映射每个项目的索引,这很快就会变得难以理解。

我可以找到正确的术语来在 Stack Overflow 上找到类似的问题。如果这是一个重复的问题,我们深表歉意。

// Initial array:

foo = ["a", "b", "C", "D", "e", "f", "G", "H", "I", "j", "k", "l", "M", "n" ]

// Desired array:

bar = ["a", "b", ["C", "D"], "e", "f", ["G", "H", "I"], "j", "k", "l", ["M"], "n" ]

这个简单的插图是不言自明的,代表了我要解决的问题。

【问题讨论】:

  • 所需的内部数组背后的逻辑是什么?你能再解释一下吗?谢谢!
  • 这只是理论上的:例如,解析 textarea 的每一行将在数组中的每一行返回一个项目。如果我想在无序列表标签下重新组合列表项怎么办?这是执行此类操作的有用之处。

标签: javascript arrays logic


【解决方案1】:
function regroupArray(array) {
  let temp = array.map(el => (el >= "A" && el <= "Z" ? [el] : el));
  temp.forEach((el, i, arr) => {
    if (Array.isArray(el)) {
      while (Array.isArray(arr[i + 1])) {
        arr[i] = arr[i].concat(arr[i + 1]);
        arr.splice(i + 1, 1);
      }
    }
  });
  return temp;
}

【讨论】:

    【解决方案2】:

    遍历循环,检查字符是否为大写字母。
    如果大写字母,则推送临时数组,否则推送结果数组。
    当序列从大写向下移动时,将临时数组推送到结果数组。

    const foo = ["a", "b", "C", "D", "e", "f", "G", "H", "I", "j", "k", "l", "M", "n" ];
    
    const isCapital = char_code => {
      const [start, end] = "AZ".split("").map(x => x.charCodeAt(0));
      return char_code >= start && char_code <= end;
    };
    
    const temp_arr = [];
    const res = [];
    
    for (let i = 0; i < foo.length; i++) {
      const currCharCode = foo[i].charCodeAt(0);
      const currIsCapital = isCapital(currCharCode);
    
      if (temp_arr.length > 0) {
        // prev is capital
        const prevCharCode = temp_arr[temp_arr.length - 1].charCodeAt(0);
        if (currIsCapital && prevCharCode + 1 === currCharCode) {
          temp_arr.push(foo[i]);
        } else {
          res.push([...temp_arr]);
          temp_arr.length = 0;
          res.push(foo[i]);
        }
      } else {
        if (currIsCapital) {
          temp_arr.push(foo[i]);
        } else {
          res.push(foo[i]);
        }
      }
    }
    
    console.log(res);

    【讨论】:

      【解决方案3】:

      重新组合数组中的项目的最简单方法是简单地将项目替换为它们的数组。您可以使用 array.splice 方法执行此操作,如下所示:
      foo.splice(1, 2, [foo[2], foo[3]]);
      这将用完全相同的值替换数组中的索引 2 - 3,但在数组中。

      【讨论】:

      • let foo = [1, 2, 3, 4, 5, 6, 7]; foo.splice(2, 3, [foo[2], foo[3]]); console.log(foo); 嗨,这不起作用。
      • 第一个参数必须减一,因为现在您要替换第三个和第四个元素。
      猜你喜欢
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多