Javascript/преобразовать строку стиля CSS в объект JS
Мы хотели бы преобразовать стиль CSS, введенный в виде строки в объект JS.
Например,
var input = " border:solid 1px; color:red ";
ожидаемый объект JS:
{
border:"solid 1px",
color:"red"
}
Конечно, количество записей стиля неограничено, а также имена стиля (граница, цвет, шрифт, z-индекс и т.д.). спасибо.
Ответы
Ответ 1
Вы можете использовать функцию разделения Javascript: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split
Сначала разделите строку с помощью ;
в качестве разделителя, а затем для каждого результата, разбитого на :
, поместите элементы в объект по мере продвижения.
например.
var result = {},
attributes = input.split(';');
for (var i = 0; i < attributes.length; i++) {
var entry = attributes[i].split(':');
result[entry.splice(0,1)[0]] = entry.join(':');
}
Ответ 2
Очень простой:
var regex = /([\w-]*)\s*:\s*([^;]*)/g;
var match, properties={};
while(match=regex.exec(cssText)) properties[match[1]] = match[2].trim();
https://regex101.com/r/nZ4eX5/1
Ответ 3
В функциональной форме:
var styleInput = " border:solid 1px; color:red ";
var result = styleInput.split(';').reduce(function (ruleMap, ruleString) {
var rulePair = ruleString.split(':');
ruleMap[rulePair[0].trim()] = rulePair[1].trim();
return ruleMap;
}, {});
Обрезать строки перед их использованием в качестве объектных ключей.
Ответ 4
Кажется, что все ответы требуют много расщепления - почему бы не сделать совпадение и не получить все пары за один раз?
function cssSplit(str){
var O= {},
S= str.match(/([^ :;]+)/g) || [];
while(S.length){
O[S.shift()]= S.shift() || '';
}
return O;
}
Ответ 5
Просто для удовольствия и для полноты...
Я не проверял совместимость между браузерами (только в Chrome), и у него есть некоторые причуды:
var input = "font-weight:bold; color: blue; margin: 0 15px";
var e = document.createElement("div");
e.setAttribute("style", input);
var output = {};
for (var i = 0; i < e.style.length; i++) {
var name = e.style[i];
var value = e.style.getPropertyValue(name);
output[name] = value;
}
Quirk заключается в том, что, хотя мы прошли в одном объявлении margin
, мы получаем объект вроде
{
color: "blue",
font-weight: "bold",
margin-bottom: "0px",
margin-left: "15px",
margin-right: "15px",
margin-top: "0px",
}
Это может быть хорошей или плохой в зависимости от того, что вы после.
Ответ 6
что-то вроде этого должно быть довольно близко:
var input = " border:solid 1px; color:red ";
var output = '{' + input.replace(/([\w-.]+)\s*:([^;]+);?/g, '\n $1:"$2",') + '\n}';
... витки
" border:solid 1px; color:red "
в
{
border:"solid 1px",
color:"red ",
}
Ответ 7
Это моя функция для преобразования строки CSS в объект:
function cssConverter(style) {
var result = {},
attributes = style.split(';'),
firstIndexOfColon,
i,
key,
value;
for(i=0; i<attributes.length; i++) {
firstIndexOfColon = attributes[i].indexOf(":");
key = attributes[i].substring(0, firstIndexOfColon);
value = attributes[i].substring(firstIndexOfColon + 1);
key = key.replace(/ /g, "");
if(key.length < 1){
continue;
}
if(value[0] === " "){
value = value.substring(1);
}
if(value[value.length - 1] === " "){
value = value.substring(0, value.length - 1);
}
result[key] = value;
}
return result;
};
Ответ 8
Здесь мой прием
function cssToObj(css) {
var obj = {}, s = css.toLowerCase().replace(/-(.)/g, function (m, g) {
return g.toUpperCase();
}).replace(/;\s?$/g,"").split(/:|;/g);
for (var i = 0; i < s.length; i += 2)
obj[s[i].replace(/\s/g,"")] = s[i+1].replace(/^\s+|\s+$/g,"");
return obj;
}
console.log( cssToObj("z-index: 4; opacity:1; transition-duration: 0.3s;") );