Строка, разделенная на 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];
}