如何将数组中的特定元素合并在一起?

问题描述

我一直在做一个个人项目,制作一个可以输入任何字符串的计算器,如果该字符串中存在可计算的问题,请解决它。

现在,我已经能够将任何字符串转换为仅包含数字和运算符的可读数组。

我的问题是一旦有了这些数组,例如[5,5,3,4,'*',2],我就需要将它们设为[5534,*,52]

告诉计算机我希望您将数组typeof number的所有元素合并为一个,同时保持运算符在位的最佳方法是什么?

这就是我现在拥有的,

let array = ['1','b','c',1,2,'d',3]
let regex = /[0-9]/;
let reop = /[*/+-]/g;
let holder = [];

let filter = array.filter(function(x){
  if (regex.test(x) === true || reop.test(x)=== true) {
    return true
  } else null
})
filter.forEach(function(x){
  if (regex.test(x)===true) {
    holder.push(parseFloat(x));
  } else {holder.push(x)}
})
console.log(holder)
let holder1 = [];
let combine = holder.filter(function(x){
  if (regex.test(x)===true){
    console.log(holder.join(''))
  }
})
console.log(holder1)

在我的示例中,我希望holder1等于[112,3]

解决方法

您可以将元素数组连接成字符串,然后使用.split()用数字序列将字符串分隔。

因此,您首先可以使用.join('')来获取:

"5534*52"

然后.split(/(\d+)/)将此字符串拆分为数字序列。这里的\d+表示被(一个或多个)数字分割,其中()用于将数字序列保留在所得的分割数组中。拆分后,您将获得一个类似于以下内容的数组:

["","5534","*","52",""]

然后可以使用.filter(Boolean)仅将真实值保留在数组中。在上述数组中,真实值是非空字符串。过滤器之后,您将得到一个看起来像这样的数组:

["5534","52"]

最后,您可以使用.map()在上述数组上进行映射,从而将字符串数字转换为数字。如果元素是数字,则可以使用一元加号运算符+x将其转换为数字,否则,可以将其保留为字符串。在地图之后,您将得到最终结果:

[5534,52]

请参见下面的工作示例

const arr = [5,5,3,4,'*',2];

const merged = arr.join('').split(/(\d+)/).filter(Boolean).map(x => isNaN(x) ? x : +x);
console.log(merged);