对于给定的字符串数组,每个字符串都有一个项目名称,请按项目名称将所有字符串分组

时间:2019-12-21 19:25:39

标签: javascript

str_arr = [“ a”,“ a”,“ b”,“ c”,“ b”]

结果数组应为[“ a 2”,“ b 2”,“ c 1”]。

使用以下代码无法获得理想的结果。

function foo(str) {
    var a = [], b = [], prev;

    for ( var i = 0; i < str.length; i++ ) {
        if ( str[i] !== prev ) {
            a.push(str[i]);
            b.push(1);
        } else {
            b[b.length-1]++;
        }
        prev = arr[i];
    }

    return [a, b];
}

var result = foo(str_arr);
var newA = result[0].map((e, i) => e  + " " + result[1][i]+ "<br>");

3 个答案:

答案 0 :(得分:2)

您可以带一个物体来计数物品,并且

  • 获取对象的键,
  • 按计数降序和键升序排序
  • 映射键并计为字符串。

然后返回数组。

function foo(transactions) {
    var counts = {};

    for (var i = 0; i < transactions.length; i++) {
        counts[transactions[i]] = (counts[transactions[i]] || 0) + 1;
    }

    return Object
        .keys(counts)
        .sort((a, b) => counts[b] - counts[a] || a > b || -(a < b))
        .map(k => k + ' ' + counts[k]);
}

var transactions = ["notebook", "notebook", "mouse", "keyboard", "mouse"],
    result = foo(transactions);

console.log(result);

答案 1 :(得分:0)

这是一个将计数添加到数组中唯一词的函数。

通过遍历已排序的数组,这使它更老套了。

function countDistinctWords (arr) {
  if (arr.length === 0) return arr;
  arr = arr.sort();
  let result = [];
  let n = 1;
  for (let i = 1; i < arr.length; i++) { 
    if (arr[i-1] == arr[i]) {n++}
    if (arr[i-1] !== arr[i]) {
      result.push(arr[i-1]+' '+n);
      n=1;
    }
  }
  result.push(arr[arr.length-1]+' '+n);
  return result;
}

str_arr= ["a", "a", "b", "c", "b"];

var str_arr2 = countDistinctWords(str_arr);
console.log(str_arr2);

答案 2 :(得分:0)

无需排序。原始数组不受影响。

function group(arr) {
  var hits = {}, group_arr = [];
  for (var i = 0; i < arr.length; i++) hits[arr[i]] = (hits[arr[i]] || 0) + 1;
  for (var hit in hits) Object.prototype.hasOwnProperty.call(hits, hit) && group_arr.push(hit + " " + hits[hit]);
  return group_arr;
}

console.log(group(["a", "a", "b", "c", "b"]));