从某个位置开始检查字符串是否与给定的字符串匹配javascript

时间:2018-12-20 06:46:58

标签: javascript regex

var obj2 = [{
  "name": "4134",
  "calls": [

  ]
}]

    var obj3 = [{ Channel: 'SIP/4134-0004462a',
        State: 'Up',
        Accountcode: '7013658596'},
      { Channel: 'SIP/4334-sa',
        State: 'Up',
        Accountcode: '07717754702',
      }]


var channelArr = [];
const Channels = obj3.reduce((acc, curVal) => {
  obj2.forEach((item)=>{
    if(curVal.Channel.includes('SIP') &&  item.name == curVal.Channel.slice(4,8).toString()){
      item.calls.push({'MobileNo':curVal.Accountcode,'Status': curVal.State})
    }
  })
  return obj2;
}, [])

console.log(obj2);

以上代码的输出为

[
  {
    "name": "4134",
    "calls": [
      {
        "MobileNo": "7013658596",
        "Status": "Up"
      }
    ]
  }
]

我的代码从obj2中获取"name": "4134",从obj3中获取Channel: 'SIP/4134-0004462a。然后,它使用代码'SIP/4134-0004462a'检查obj2的值curVal.Channel.includes('SIP') && item.name == curVal.Channel.slice(4,8).toString()中是否存在obj2的4134。如果该值存在,则它将来自该特定对象的MobileNoAccountCode推送到obj2的调用数组中。 由于Channel: 'SIP/4134-0004462a在这里非常容易预测,就好像值包含SIPslice(4,8)的位置一样,因此4134完美匹配。但是,如果我必须匹配4134之类的值而不是"name" : "4134556"怎么办?在这种情况下,它将无法工作,因为如果在obj3上使用4134556,则'SIP/4134556-0004462a将与slice(4,8)不匹配。 我想要一个解决方案,使其从obj2获取名称键的值,并从obj3获取通道键的值,并检查obj2的值是否存在于从位置4开始的通道值中(即在SIP /之后),我不想来设置splice(4,8)之类的限制,它应该是动态的,可以将名称的任何数字与Channel从Channel值中的位置4开始匹配(期望类似于splice(start from 4th position and match the next digits for a match))。即使它们有任意数字,这也让我可以完美地匹配数字。

我尝试作为临时解决方案的内容:

if(curVal.Channel.includes('SIP') && curVal.Channel.includes(item.name))

但是这使我在obj3的Channel : SIP/3422-0413462a处得到错误的结果,也将与obj2的name : 4134匹配,因为它在其他位置包含数字4134,这不是期望的结果。

我该怎么做,以使obj2中的名称与obj3的通道从第4个位置开始匹配,即在SIP/之后并检查是否存在匹配项?

3 个答案:

答案 0 :(得分:3)

您可以使用String.prototype.startsWith(searchString, position)

console.log('SIP/4134556-0004462a'.startsWith('4134556', 4)); // true

通过position参数可以指定要在大海捞针中搜索针的位置(在您的情况下为4)。

这可能会给您带来另一个问题,因为它也会评估为true:

'SIP/4134556-0004462a'.startsWith('4134', 4); // true

如果这不是您想要的(即,您希望值后面跟随-分隔符),则必须将分隔符添加到搜索字符串中:

'SIP/4134556-0004462a'.startsWith('4134' + '-', 4) // false

答案 1 :(得分:1)

您可以使用名称长度作为第二个参数进行切片。您在这里不需要正则表达式:)

类似的东西

curVal.Channel.slice(4,4+item.name.length)
                       ^^^^^^^^^^^^^^^^^^

var obj2 = [{
  "name": "4134123",
  "calls": [

  ]
}]

    var obj3 = [{ Channel: 'SIP/4134123-0004462a',
        State: 'Up',
        Accountcode: '7013658596'},
      { Channel: 'SIP/4334-sa',
        State: 'Up',
        Accountcode: '07717754702',
      }]


var channelArr = [];
const Channels = obj3.reduce((acc, curVal) => {
  obj2.forEach((item)=>{
    if(curVal.Channel.includes('SIP') &&  item.name == curVal.Channel.slice(4,4+item.name.length).toString()){
      item.calls.push({'MobileNo':curVal.Accountcode,'Status': curVal.State})
    }
  })
  return obj2;
}, [])

console.log(obj2);

答案 2 :(得分:1)

从位置Channel到结束的4子字符串中,并检查该子字符串中是否存在名称

var channel = "SIP/4134123-0004462a"; //your channel name
console.log(channel.substring(4).includes("4134123")); //your name

相关问题