Строка, разделенная на javascript Object

У меня есть строка, поступающая с сервера:

//A
123|155-244
  • Первые цифры всегда означают "Красный"
  • Число после | всегда означает "зеленый"
  • Число после - всегда означает "синий"

Проблема здесь в том, что зеленый и синий могут возвращаться в любом порядке:

//B
123-244|155

Или они могут отсутствовать полностью:

//C
123|155 

Мне нужна функция, которая возвращает один массив/объект, чтобы упростить задачу:

//A
var result = {red:"123", green:"155", blue:"244"}

//B
var result = {red:"123", green:"155", blue:"244"}

//C
var result = {red:"123", green:"155", blue:"0"}

Я пробовал две функции: один, чтобы получить зеленый и другой синий, но я понял, что не работает должным образом в зависимости от порядка, который они появляются в строке.

var getGreen = function(myvar){
    return myvar.split('-'); 
};
var getBlue = function(myvar){
    return myvar.split('|'); 
};

Выполнение этого иногда приводит к тому, что мой объект выглядит следующим образом:

var result = {red:"123", green:"155", blue:"244|155"}

Как мне следует продолжить?

Ответ 1

Нет необходимости в регулярных выражениях:

parse = function(s) {
    return {
        red:   parseInt('+' + s, 10) || 0,
        green: parseInt(s.split('|')[1], 10) || 0,
        blue:  parseInt(s.split('-')[1], 10) || 0,
    };
};

//

test = [
    '123',
    '222|333-444',
    '55-66|77',
    '123|456',
    '123-456',
    '|123-456',
    '-123|456',
    '010|020-030',
  
];
  
test.map(parse).forEach(r => 
   document.write('<pre>' + JSON.stringify(r) + '</pre>'));

Ответ 2

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

exec() каждое Regex, и совпадение будет сохранено в индексе 1 результирующего массива. Если совпадения нет, то null возвращается из exec(), поэтому используйте фиктивный массив [null, 0] для упрощения.

Хотя это не требование, это также работает, если нет красного значения.

function getRGB() {
  var reRed = /^([0-9]+)/; // start of string (^) then match 1+ numbers
  var reGreen = /\|([0-9]+)/; // a "|" then match 1+ numbers
  var reBlue = /-([0-9]+)/;  // a "-" then match 1+ numbers

  return {
    red: (reRed.exec(input) || [null, 0])[1],
    green: (reGreen.exec(input) || [null, 0])[1],
    blue: (reBlue.exec(input) || [null, 0])[1]
  };
}

// RGB
var input = '123|155-244';
console.log(input, getRGB(input));

// RBG
var input = '123-244|155';
console.log(input, getRGB(input));

// RB
input = '123-244';
console.log(input, getRGB(input));

// BG
var input = '-244|155';
console.log(input, getRGB(input));

Ответ 3

Вы можете использовать String#match с RegEx.

var str = '123|155-244';

var result = {
    red: (str.match(/^\d+/) || [0])[0], // Get first digits or zero
    green: (str.match(/\|(\d+)/) || [0, 0])[1], // Get digits after `|` or zero
    blue: (str.match(/-(\d+)/) || [0, 0])[1] // Get digits after `-` or zero
};

console.log(result);
document.getElementById('pre').innerHTML = JSON.stringify(result, 0, 4);
<pre id="pre"></pre>

Ответ 4

Вы говорите, что первый номер всегда красный, поэтому

myString = "123-155|244";
red = "0";
green = "0";
blue = "0";
red = mysString.substring(0,3);
if(myString.indexOf("|")!=-1)
{
  green = mystring.substring(myString.indexOf("|")+1,myString.indexOf("|")+4);
}
if(myString.indexOf("-")!=-1)
{
  blue = mystring.substring(myString.indexOf("-")+1,myString.indexOf("-")+4);
}
console.log(red+green+blue);

Ответ 5

Вы можете использовать string.match(regex):

var str = "123|155-244",  // <--------the string
  arr = str.match(/(\d{3})+/g), // <----creates array out of str
  obj = {
    red: arr[0], // put first one as red value
    green: arr[1], // second one as green value
    blue: arr.length == 3 ? arr[2] : "000" // as per length of array put blue value 
  };

document.querySelector('pre').innerHTML = JSON.stringify(obj);
<pre></pre>

Ответ 6

может быть, это то, что вы хотите, и написать какое-то другое условие, как вы хотите

var color = {red:null,blue:null,green:null};
var s ="123-244|155";
var blue_index = s.indexOf("|") ;
var green_index = s.indexOf("-") ;
if(blue_index>green_index){
    color.blue = s.split("|")[1];
    s = s.split("|")[0];
}else{
    color.green = s.split("-")[1];
    s = s.split("|")[0];
}
if(s.indexOf("|") > -1){
    color.blue =  s.split("|")[1];
    color.red  =   s.split("|")[0];
}   
if(s.indexOf("-") > -1){
    color.green =  s.split("-")[1];
    color.red  =   s.split("-")[0];
}

Ответ 7

Вы можете попробовать это, в конце испытанного тестирования со всеми 3 условиями -

function rgbFun(a){
    //Define object either way
    //rgb = {'red':0,'blue':0,'green':0}; 
    rgb = {};
    var r = a.substr(0,3),
        b = a.splitOnLast('-')[1], //will check the last splitted value of blue
        g = a.splitOnLast('|')[1]; //will check the last splitted value of green
    rgb.red = r;
    if(b){
        rgb.blue = b.substr(1,3);
    }else{
        rgb.blue = 0;
    }
    if(g){
        rgb.green = g.substr(1,3);
    }else{
        rgb.green = 0;
    }
    return rgb;
}
rgbFun(CaseA);
//Result - {red: "123", blue: "244", green: "155"}
rgbFun(CaseB);
//Result - {red: "123", blue: "244", green: "155"}
rgbFun(CaseC);
//Result - {red: "123", blue: 0, green: "155"}

Ответ 8

Пожалуйста, попробуйте этот код HTML: -

<h1 id="red">Red</h1>
<h1 id="green">Green</h1>
<h1 id="blue">Blue</h1>
<input type="submit" id="byBtn" value="Change" onclick="change()"/>

JavaScript: -

 var myvar="123-244|155";
 var getGreen = myvar.split('-');
var getBlue = getGreen[1].split('|');
function change(){
red.innerHTML+=" ="+getGreen[0];
blue.innerHTML+=" ="+getBlue[0];
green.innerHTML+=" ="+getBlue[1];
}