我有一个javascript字符串数组,由nodejs处理以更改输出。需要合并相同字符串前缀的值。
我所拥有的:
[
"$button-primary-font-color-default: ('light':#000);",
"$button-primary-font-color-default: ('dark':#fff);"
]
我想要什么:
["$button-primary-font-color-default: ('light':#000, 'dark':#fff);"]
我尝试过array.filter,但没有成功。我不太擅长正则表达式。
谢谢你在这方面的帮助。
使用reduce
方法按属性名称分组。然后将解决方案扁平化为所需的格式。这与其他答案类似,只是在属性上更通用一点。
var input = [
"$button-primary-font-color-default: ('light':#000);",
"$button-primary-font-color-default: ('dark':#fff);",
"$button-secondary-font-color-default: ('secondary':red);"
];
var step1 = input.reduce(function(agg, line) {
var prop = line.slice(0, line.indexOf(':')).trim();
var value = line.slice(line.indexOf(':') + 1, line.indexOf(';')).trim().slice(1, -1);
agg[prop] = agg[prop] || []
agg[prop].push(value)
return agg;
}, {})
var result = Object.entries(step1).map(function([prop,value]) {
return prop + " " + "(" + value.join(", ") + ")";
});
console.log(result)
例如,首先,我创建一个对象,用它的值数组对每个键进行分组。
{
"$button-primary-font-color-default:": ["'light':#000", "'dark':#fff"]
}
然后我map
将对象设置为字符串格式。
const data = [
"$button-primary-font-color-default: ('light':#000);",
"$button-primary-font-color-default: ('dark':#fff);"
]
const obj = data.reduce((acc, i) => {
const [_, key, value] = i.match(/($.*?:)s(('w+':s?.+?));/i)
acc[key] ? (acc[key] = [...acc[key], value]) : acc[key] = [value]
return acc
}, {})
const result = Object.entries(obj).map(([key, value]) => {
return `${key} (${value.join(', ')})`
})
console.log(result)