首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将只显示一次和0次的数字包含到此程序输出中?

如何将只显示一次和0次的数字包含到此程序输出中?
EN

Stack Overflow用户
提问于 2019-04-07 03:28:25
回答 1查看 69关注 0票数 0

我有这个程序,目前发现重复的,并打印出来,使用多姆在各部分。我正在编辑它,以便它还显示输入数组中根本没有发生过的数字,以及在输入数组中只发生过一次的数字。不包括0作为一个没有发生的数字。另外,将变量设置为最大数字范围,我们将检查输入数组中是否出现一个数字。输出的分段工作得很好,我基本上只是在输出中添加0和1次的数字。我看不出该怎么做才对。请协助。谢谢。

示例数组输入4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,5 当前示例输出:(区段变量= 3): 4-9次 2-8次 3-7次 1-6次 7-5次 6-4次 期望输出:示例1(区段变量=3.number variable = 9): 4-9次 2-8次 3-7次 1-6次 7-5次 6-4次 5-1次 8-0次 9-0次 期望输出:示例2(区段变量=3.number variable = 21): 4-9次 2-8次 3-7次 1-6次 7-5次 6-4次 5-1次 8-0次 9-0次 10-0次 11-0次 12-0次 13 -0次 14 -0次 15-0次 16 -0次 17 -0次 18 -0次 19 -0次 20 -0次 21 -0次

代码语言:javascript
复制
//Count how many times each number shows up

//const duplicateArr2 = [1, 1, 1, 1, 1, 100, 3, 5, 2, 5, 2, 23, 23, 23, 23, 23];
//const duplicateArr1 = [5, 3, 7, 4, 7, 5, 3, 2, 7, 3, 2];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54,100,100,200,200,300,300];

//const duplicateArr2 = searchednumbers;
const duplicateArr2 = [4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 3, 7, 3, 3, 3, 1, 6, 6, 1, 1, 1, 1, 1, 7, 7, 7, 7, 6, 6, 5]

const getArrayOfDuplicated = array => {
  const hash = array.reduce((a, c) => (a[c] = ++a[c] || 1, a), {});

  return Object.entries(hash)
    .filter(([k, v]) => v > 1)
    .sort(([ak, av], [bk, bv]) => bv - av)
    .reduce((a, [k, v]) => [...a, `${k} - ${v} times`], [])
};

// given a number of items to be sectioned into a certain number of groups
// returns a list of length nGroups with the number of items in each group
// such that at least (nGroups - 1) groups contain an equal number of items
// eg. getGrouping(10, 2) -> [5, 5]
// eg. getGrouping(10, 6) -> [1, 1, 1, 1, 1, 5]
const getGrouping = (nItems, nGroups) => {
  if (nGroups > nItems)
    return Array(nItems).fill(1);
  else if (!(nItems % nGroups))
    return Array(nGroups).fill(parseInt(nItems / nGroups));
  else {
    let numberOfEqualGroups = nGroups - 1;
    var itemsPerEqualGroup;
    if (!(nItems % (nGroups - 1)))
      itemsPerEqualGroup = parseInt(nItems / (nGroups - 1)) - 1;
    else
      itemsPerEqualGroup = parseInt(nItems / (nGroups - 1));
    equalGroups = Array(numberOfEqualGroups).fill(parseInt(itemsPerEqualGroup));
    remainder = nItems - itemsPerEqualGroup * numberOfEqualGroups;
    return equalGroups.concat(remainder);
  }
}

// takes an array and formats it into sections according to grouping
// returns a string with a newline after each line and two new lines between sections
const formatGrouping = (array, grouping) => {
  var outputString = ""
  var linesDone = 0;
  for (var section = 0; section < grouping.length; section++) {
    for (var line = 0; line < grouping[section]; line++) {
      outputString += array[linesDone] + '<br>';
      linesDone += 1;
    }
    outputString += '<br>';
  }
  return outputString;
};

var numberOfSections = 3;
result = getArrayOfDuplicated(duplicateArr2);
document.getElementById("jsresultsoutput").innerHTML = formatGrouping(result, getGrouping(result.length, numberOfSections));
代码语言:javascript
复制
<p id="jsresultsoutput"></p>

EN

回答 1

Stack Overflow用户

发布于 2019-04-07 05:42:38

你的代码几乎是正确的。你错过了一件事,你有一个不必要的filter

缺失:在进行计数之前,您需要创建一个数字映射(1到numbersrange)。否则,0出现的数字就不会出现。我是这样做的

代码语言:javascript
复制
const mapOfNumbers = new Array(numbersrange + 1).fill(0).reduce((acc, _, i) => (acc[i] = 0, acc), {});
delete mapOfNumbers[0];

额外:.filter(([k, v]) => v > 1)并不是必需的,因为您希望10也出现。

代码语言:javascript
复制
//Count how many times each number shows up

//const duplicateArr2 = [1, 1, 1, 1, 1, 100, 3, 5, 2, 5, 2, 23, 23, 23, 23, 23];
//const duplicateArr1 = [5, 3, 7, 4, 7, 5, 3, 2, 7, 3, 2];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54];
//const duplicateArr2 = [4,4,4,4,2,4,4,4,4,4,2,2,2,3,2,2,2,2,3,3,3,7,3,3,3,1,6,6,1,1,1,1,1,7,7,7,7,6,6,55,55,67,67,45,54,45,54,100,100,200,200,300,300];

//const duplicateArr2 = searchednumbers;
const duplicateArr2 = [4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 3, 7, 3, 3, 3, 1, 6, 6, 1, 1, 1, 1, 1, 7, 7, 7, 7, 6, 6, 5]

const getArrayOfDuplicated = (array, numbersrange) => {
  const mapOfNumbers = new Array(numbersrange + 1).fill(0).reduce((acc, _, i) => (acc[i] = 0, acc), {});
  delete mapOfNumbers[0];
  const hash = array.reduce((a, c) => (a[c] = ++a[c] || 1, a), mapOfNumbers);
  return Object.entries(hash)
    .sort(([ak, av], [bk, bv]) => bv - av)
    .reduce((a, [k, v]) => [...a, `${k} - ${v} times`], [])
};

// given a number of items to be sectioned into a certain number of groups
// returns a list of length nGroups with the number of items in each group
// such that at least (nGroups - 1) groups contain an equal number of items
// eg. getGrouping(10, 2) -> [5, 5]
// eg. getGrouping(10, 6) -> [1, 1, 1, 1, 1, 5]
const getGrouping = (nItems, nGroups) => {
  if (nGroups > nItems)
    return Array(nItems).fill(1);
  else if (!(nItems % nGroups))
    return Array(nGroups).fill(parseInt(nItems / nGroups));
  else {
    let numberOfEqualGroups = nGroups - 1;
    var itemsPerEqualGroup;
    if (!(nItems % (nGroups - 1)))
      itemsPerEqualGroup = parseInt(nItems / (nGroups - 1)) - 1;
    else
      itemsPerEqualGroup = parseInt(nItems / (nGroups - 1));
    equalGroups = Array(numberOfEqualGroups).fill(parseInt(itemsPerEqualGroup));
    remainder = nItems - itemsPerEqualGroup * numberOfEqualGroups;
    return equalGroups.concat(remainder);
  }
}

// takes an array and formats it into sections according to grouping
// returns a string with a newline after each line and two new lines between sections
const formatGrouping = (array, grouping) => {
  var outputString = ""
  var linesDone = 0;
  for (var section = 0; section < grouping.length; section++) {
    for (var line = 0; line < grouping[section]; line++) {
      outputString += array[linesDone] + '<br>';
      linesDone += 1;
    }
    outputString += '<br>';
  }
  return outputString;
};

var numberOfSections = 3;
var numbersrange = 9;
result = getArrayOfDuplicated(duplicateArr2, numbersrange);
document.getElementById("jsresultsoutput").innerHTML = formatGrouping(result, getGrouping(result.length, numberOfSections));
代码语言:javascript
复制
<p id="jsresultsoutput"></p>

另外,阅读关于你的问题的评论会给你一个完整的解决方案,你错过了。你可以说我已经把评论汇编成一个单一的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55555356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档