【问题标题】:How might I return multiple arrays with equal values from a larger array with mixed values?如何从具有混合值的较大数组中返回具有相等值的多个数组?
【发布时间】:2012-06-05 22:03:09
【问题描述】:

我有一个数组,排序后如下所示:

var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];


有 2 个 "a" 字符串、4 个 "b" 字符串和 3 个 "c" 字符串。

我正在尝试返回 3 个单独的数组,从循环中一次返回一个,包含 only 匹配值。因此,在第一次迭代时,返回的数组将显示为 newArr = ["a", "a"],第二次显示为 newArr = ["b", "b", "b", "b"],第三次迭代显示为 newArr = ["c", "c", "c"]

但是,这是一个预定义值的小数组,我需要一种算法,它可以对 unknown 大小、unknown 元素的数组执行相同的操作,并且使用 未知 类似元素的数量。 (请记住,在这种情况下,数组已经开始排序)

这是我的疯狂代码,它显示了一些不寻常且不正确的结果:

var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];

for(var index = 0; index < arr.length; index++)
{
  var test = "";
  var newArr = []; // resets the new array upon each iteration
  var str = arr[index]; // initialized as the next unique index-value

  for(var i = index; i < arr.length; i++)
  {
    if(arr[i] == str)
    {
      newArr.push(arr[k]);
      test += arr[i] + " ";
    }
    else
    {
      index = i; // changing the outer loop variable
      break; // exiting the inner loop
    }
  } // end of inner loop

  window.alert(test);
  setValues(newArr);

} // end of outer loop

function setValues(arrSorted)
{
  var here = document.getElementById("here");

  for(var i = 0; i < arrSorted.length; i++)
  {
    here.innerHTML += arrSorted[i] + "&nbsp;";
  }

  here.innerHTML += "<br />";

} // end of setValues function

【问题讨论】:

  • 请编辑您的问题以澄清["a","a","b","b","a","a"] 将返回[["a","a"],["b","b"],["a","a"]] 还是[["a","a","a","a"],["b","b"]],以及您是否希望函数输入像您的第一个数组一样排序。
  • 在您给出的示例中,["a", "a", "b", "b", "a", "a"] 应该返回 2 个数组:["a", "a", "a", "a",]["b", "b"]
  • 而且我有一个对数组进行排序的函数,上面没有提到,但是数组会在拆分成几个数组之前进行排序。

标签: javascript arrays sorting string-matching array-push


【解决方案1】:
var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];
var arrays = {};
for (var i=0;i<arr.length;i++) {
  if (!arrays[arr[i]]) arrays[arr[i]] = [];
  arrays[arr[i]].push(arr[i]);
}

这会给你相当于

arrays = {};
arrays['a'] = ['a','a'];
arrays['b'] = ['b','b','b','b','b'];
arrays['c'] = ['c','c','c'];

【讨论】:

  • 这是一个非常优雅简洁的解决方案!
【解决方案2】:

您可以使用这样的函数将数组分成几个数组:

function divide(arr) {

  var subArrays = [];
  var current = null;
  var subArray = null;

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] != current) {
      if (subArray != null) subArrays.push(subArray);
      current = arr[i];
      subArray = [];
    }
    subArray.push(arr[i]);
  }
  if (subArray != null) subArrays.push(subArray);
  return subArrays;
}

演示:http://jsfiddle.net/Guffa/d8CBD/

【讨论】:

    【解决方案3】:

    我会这样做:

    var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];
    
    var out = [], prev;
    for (var i = 0, j = 0, len = arr.length; i < len; i++) {
        if (arr[i] !== prev || !out.length) {
            out[j++] = [prev = arr[i]];
        } else {
            out[j - 1].push(prev);
        }
    }
    
    //out -> [["a","a"],["b","b","b"],["c","c","c"]]
    

    Demo

    注意:|| !out.length 检查只是正确处理以undefined 开头的数组,但如果永远不会出现这种情况,请随意删除它

    【讨论】:

      猜你喜欢
      • 2017-04-08
      • 2018-03-09
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多