在第n个位置插入数组

时间:2019-01-07 15:17:35

标签: javascript arrays

我想要实现的是从一个简单的字符串输入中创建一个带有千位分隔符的格式化数字。 因此,我的输入应类似于idx=pd.MultiIndex.from_tuples([(np.nan,1),(1,1),(1,2)]) df=pd.DataFrame([1,2,3],index=idx) df.reset_index().filter(like='level_').isna() Out[304]: level_0 level_1 0 True False 1 False False 2 False False ,而我的预期返回值应类似于let input = "12345"

我知道已经有几个库可以解决这个问题,但是我想保持简单,并自己完成。我当前的解决方案有点多余(因为有两个"12,345"),而且我很确定,有更好的解决方案。

.reverse()

6 个答案:

答案 0 :(得分:1)

您可以通过在字符串末尾查找一组三个字符来替换。

var string = '12345678';

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

答案 1 :(得分:1)

我已针对另一个问题Insert new element after each nt-h array element作了这个回答。这是一种通用方法,它在每个N位置插入一个标记。该解决方案通过splice方法使用while循环。我扩展了它以支持从数组末尾开始。另一个选择...

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(""));

但是,很显然,就像人们评论的那样,您最好的选择是使用input.toLocaleString('en-US')

let input = "1234567890";
console.log(Number(input).toLocaleString("en-US"));

答案 2 :(得分: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()

答案 3 :(得分: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', ','));

答案 4 :(得分: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);

答案 5 :(得分: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  '))