проверить, совпадает ли строка с заданной строкой с определенной позиции в дальнейшем javascript - PullRequest
0 голосов
/ 20 декабря 2018

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"
      }
    ]
  }
]

Мой код принимает "name": "4134" от obj2 и Channel: 'SIP/4134-0004462a от obj3.Затем он проверяет, существует ли 4134 из obj2 в значении 'SIP/4134-0004462a' из obj3, используя код curVal.Channel.includes('SIP') && item.name == curVal.Channel.slice(4,8).toString().Если значение существует, то оно выталкивает MobileNo и AccountCode из этого конкретного объекта и помещает его в массив вызовов obj2.Так как Channel: 'SIP/4134-0004462a здесь очень предсказуемо, как будто значение содержит SIP и slice(4,8) position, то 4134 идеально подходит.Но что, если вместо 4134 мне нужно сопоставить значение, например "name" : "4134556"?В этом случае он не будет работать, так как 4134556 не будет совпадать с 'SIP/4134556-0004462a, если я использую slice(4,8) в obj3.Я хочу, чтобы решение было таким, что оно берет значение имени ключа от 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))

, но это дает мне неверный результат при Channel : SIP/3422-0413462aиз obj3 также будет совпадать с name : 4134 из obj2, так как он содержит число 4134 в какой-то другой позиции, и это не желаемый результат.

Как мне сделать так, чтобы имя из obj2 соответствовало каналуobj3 начиная с 4-й позиции, т.е. после SIP/, и проверьте, есть ли совпадение?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Вы можете использовать длину имени в качестве второго параметра для нарезки.тебе не нужно регулярное выражение здесь, приятель:)

Как-то так

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);
0 голосов
/ 20 декабря 2018

Получить подстроку Channel с позиции 4 до конца и проверить, что имя существует в этой подстроке или нет

var channel = "SIP/4134123-0004462a"; //your channel name
console.log(channel.substring(4).includes("4134123")); //your name
0 голосов
/ 20 декабря 2018

Вы можете использовать String.prototype.startsWith(searchString, position):

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

Параметр position позволяет указать, где в стоге сена вы хотите найти иголку (в вашем случае положение 4).

Это может вызвать у вас еще одну проблему, так как это также приведет к истине:

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

Если это не то, что вы хотите (т.е. вы хотите, чтобы за значением следовал разделитель -), у вас естьчтобы добавить разделитель в строку поиска:

'SIP/4134556-0004462a'.startsWith('4134' + '-', 4) // false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...