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



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。然后,它使用代码curVal.Channel.includes('SIP') && item.name == curVal.Channel.slice(4,8).toString()检查 obj2 中的值中是否存在来自 obj2 的 4134'SIP/4134-0004462a'来自 obj3 的值。如果该值存在,则它从该特定对象推送MobileNoAccountCode,并将其推送到 obj2 的调用数组中。 由于Channel: 'SIP/4134-0004462a在这里非常可预测,就好像该值包含SIP并且slice(4,8)位置,因此4134完美匹配。但是,如果我必须匹配"name" : "4134556"这样的值而不是4134呢?在这种情况下,它不起作用,因为如果我在 obj3 上使用slice(4,8)4134556它将无法与'SIP/4134556-0004462a匹配。 我想要一个解决方案,使其从 obj2 获取名称密钥的值并从 obj3 获取通道密钥的值,并检查 obj2 的值是否存在于从位置 4 开始的通道值中(即在 SIP/之后)我不想像splice(4,8)那样设置限制,相反,它应该是动态的,可以将任何名称数字与从通道中的位置 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/之后并检查是否有匹配?

您可以使用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

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

像这样的东西

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

从位置4到末尾获取Channel的子字符串,并检查该子字符串中是否存在名称

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

最新更新