在每个第n个位置插入数组

4
我想做的是从简单的字符串输入中创建带有千位分隔符的格式化数字。所以我的输入看起来像这样let input = "12345",我期望的返回值应该看起来像"12,345"
我知道已经有几个库可以处理这个问题,但我想保持简单,只是自己做。我的当前解决方案有点冗余(因为双重.reverse()),我相信有更好的解决方案。
let array = input.split('');

array.reverse();

for (let i = 3; i < array.length; i += 4) {
    array.splice(i, 0, ',');
}

array.reverse();

return array.join('');

6
不需要使用库或自行编写解决方案。每个当前的浏览器都支持 Number.prototype.toLocaleString 方法。 - str
如果你想自己编写代码,为了简洁而牺牲可读性的话... - danh
2
Number("12345").toLocaleString(); - Ana Liza Pandac
1
input.toLocaleString('en-US')。指定 en-US 以获取千位分隔符。例如在 en-IN 中,数字表示方式是不同的。 - Mortz
1
(e.g. with .map or .reduce). You could do -> input.split("").map((m,i) => (a.length - i) % 3 === 0 && (i > 0) ? "," + m : m).join("") - Keith
显示剩余3条评论
6个回答

2
我曾为另一个问题提供了类似的答案:在每个 nt-h 数组元素后插入新元素。这是一种通用方法,可以在每 N 个位置插入一个标记。解决方案使用了 while 循环和 Array.splice() 方法。为了满足您的要求,我将其扩展以支持从数组末尾开始插入。这只是另一种选择...

let insertTokenEveryN = (arr, token, n, fromEnd) => {

    // Clone the received array, so we don't mutate the
    // original one. You can ignore this if you don't mind.

    let a = arr.slice(0);
    
    // Insert the <token> every <n> elements.

    let idx = fromEnd ? a.length - n : n;

    while ((fromEnd ? idx >= 1 : idx <= a.length))
    {
        a.splice(idx, 0, token);
        idx = (fromEnd  ? idx - n : idx + n + 1);
    }

    return a;
};

let array = Array.from("1234567890");
let res1 = insertTokenEveryN(array, ",", 3, true);
console.log(res1.join(""));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

但是,显然,像评论中提到的那样,您最好使用 input.toLocaleString('en-US')

let input = "1234567890";
console.log(Number(input).toLocaleString("en-US"));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}


1
尽管在您的示例中,您最后使用了一个字符串,但标题说“进入数组”。这是使用lodash相当紧凑的方式:
import { chunk, flatten } from 'lodash'

const ADD_EVERY = 5
const ITEM_TO_ADD = {}

const data = flatten(
  chunk(input, ADD_EVERY).map((section) => 
  section.length === ADD_EVERY ? [...section, ITEM_TO_ADD] : section
)

这在概念上有点类似于执行split().join()。

0
您可以通过查找字符串末尾的三个字符来进行替换。

var string = '12345678';

console.log(string.replace(/(?=(...)+$)/g, ','));


0

这是一个简单的解决方法,但使用正则表达式会更好。

function separate(str, separator) {
  // Handling the head case (from 0 to 2 size)
  const headSize = str.length % 3;
  
  let newFormat = headSize ? `${str.substr(0, headSize)}${separator}` : '';
  
  // Handle every 3 character
  const nbTripleChar = (str.length - headSize) / 3;

  for (let i = 0; i < nbTripleChar; i += 1) {
     newFormat = `${newFormat}${str.substr((i * 3) + headSize, 3)}`;
     
     if ((i + 1) !== nbTripleChar) {
       newFormat = `${newFormat}${separator}`;
     }
  }
  
  return newFormat;
}

console.log(separate('12515', ','));


0

您可以通过第二个索引反向迭代数组并构建字符串。字符串连接可能会很耗费时间,但它只迭代一次列表。您还可以使用.reduce()来完成此操作,而无需使用for循环(因为几乎任何数组迭代操作现在都可以作为函数调用完成);

let input = 123456789949949291;
let array = input.toString().split('');
let candidateString = '';


for (let i = array.length-1; i >=0; i--) {
    candidateString=array[i]+candidateString;
    let revIndex=array.length-i;
    if(revIndex%3==0 && revIndex!== array.length){
      candidateString = ','+candidateString;
    }
}

console.log(candidateString);


0
如果你不是Regex的粉丝,或者不想使用内置函数如toLocaleString(),这个代码应该可以处理你可能遇到的大多数情况。

function format(str) {
  str = str.trim().replace(/\s+/g, '')
  if (isNaN(str)) return 'NaN'
  str = str.split('')
  let strBuild = [str.pop()]
  for (let number of strBuild) {
    if (strBuild.length % 3 === 0) strBuild.unshift(str.pop() + ',')
    else strBuild.unshift(str.pop())
    if (!str.length) return strBuild.join('');
  }
}
console.log(format('1 '))
console.log(format('1 a 2'))
console.log(format(' 12 '))
console.log(format('123 '))
console.log(format(' 123'))
console.log(format(' 1 2 3'))
console.log(format('1 2 3 '))
console.log(format('12 34'))
console.log(format('123   45678'))
console.log(format('12349  567  8'))
console.log(format('  1234 9567   81   '))
console.log(format('  1234 9567   81 9 7 5 6 4 5 8 '))
console.log(format('  1234 9567   81 c  '))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接