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。如果该值存在,则它将来自该特定对象的MobileNo
和AccountCode
推送到obj2的calls数组中。由于
Channel: 'SIP/4134-0004462a
在此处非常可预测,就像值包含SIP
和slice(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/
之后并检查是否存在匹配项? 最佳答案
您可以使用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