【问题标题】:How to write a Javascript function that sorts account numbers in a string?如何编写一个对字符串中的帐号进行排序的Javascript函数?
【发布时间】:2020-05-30 22:44:11
【问题描述】:

编写一个函数,对字符串中的帐号进行排序,并返回排序后的帐号字符串。同时删除重复项并在原始 bankNumber 的末尾添加重复项的数量 例如:

12455 1435 5
 12455 1435 5

将是:

12455 1435 52

示例:

 var input = `2
 5
 12455 1435 5
 12455 1435 5
 23454 3554 5 
 12344 1435 30
 12344 1435 30

 2
 41234 5451 9 
 13451 5151 5
 `;

output = "2
 5
 12344 1435 302
 12455 1435 52
 23454 3554 5 

 2
 13451 5151 5
 41234 5451 9 
 "

我已使用 split("\n") 将字符串拆分为一个数组。 并使用 for 循环和 sort() 对数组进行排序。 主要是难以让它对两个交易进行排序。

谢谢。

这是我目前所拥有的:

function sort(a) {
  let totalTests = a.slice(0, 1);
  let newString = a.slice(2);
  let arr = newString.split("\n");
  let tempBankNumbers = 0;

  let multiArr = [];
  let arr2 = [1]
  let tempBankNumberAmount = arr2.splice(0, 1);
  let totalTestsInt = parseInt(totalTests);

    for(let i = 0; i < totalTestsInt -1 ; i++)
  {
    let arrayTemp = arr.splice(0, arr.indexOf(""))
   multiArr[i] = (arrayTemp)
  }
  arr2.sort();

  var tempBankNumber = "";

  let returnArray = [];
  returnArray.push(tempBankNumberAmount[0]);

  for (let i = 0; i < arr2.length; i++) {
    tempBankNumber = arr2[i];
    let numberOfAccounts = 1;

    for (let j = i + 1; j < arr2.length; j++) {
      if (arr2[i] == (arr2[j])) {

        arr2[i] = arr2[i].concat(++numberOfAccounts)
        arr2.splice(j, 1)
      }
    }
  }
  arr2.unshift(tempBankNumberAmount[0])
  return a; 
}

【问题讨论】:

  • 这是我目前所拥有的
  • 没有必要拆分它们,词法排序工作正常
  • 我还需要删除重复项,并在最后计算重复项的数量。

标签: javascript arrays string sorting


【解决方案1】:

我已经将 cmets 放到了它的工作原理中。我假设它们应该仅基于原始值进行词法排序,而不是基于附加的字符串。
使用对象映射来跟踪重复计数,然后展开对象映射。

var input = `2
 5
 12455 1435 5
 12455 1435 5
 23454 3554 5 
 12344 1435 30
 12344 1435 30

 2
 41234 5451 9 
 13451 5151 5
 `;

const [t, ...split] = input.split(/\s*\n+\s*/)

const r = [], rn = []
let n
while (n = split.shift()) {
  rn.push(n)
  r.push(
    Object.entries(
      // sort first
      split.splice(0, +n).sort()
        // increment object map count value
        .reduce((a, x) => (a[x] = (a[x] || 0) + 1, a), {}))
     // append count if > 1
    .map(([k, v]) => `${k}${v>1?v:''}`))
}

// concat the input count numbers in the input and join result array
console.log(t+'\n'+r.map((x,i)=>`${rn[i]}\n${x.join('\n')}`).join('\n'))

【讨论】:

  • 太棒了!谢谢,现在我会试着解开这个。不久前我做了java脚本。所以几年后回来。
  • 你能解释一下:.reduce((a, x) => (a[x] = (a[x] || 0) + 1, a), {})) 吗?我不确定 , a 是什么意思或 , {}
  • developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…(a,b,c,d,e,f)===f。我可能不会在与他人共享的实际生产代码中使用它,除非我有充分的理由或者代码非常干净,但它更短,同时允许我使用数组赋值而不是使用扩展运算符进行合并.以便为reduce的下一次迭代返回完整的对象
  • {}是初始化对象映射。否则 reduce 使用数组中的第一个对象,这不是我想要的。
猜你喜欢
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2011-12-27
  • 2022-06-16
  • 2010-09-08
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多