Я смотрю на cssText элемента и получаю следующую строку:
Вход:
"position: absolute; left: 33.999%; top: 835px; opacity: 1; transition-property: opacity, transform; transition-duration: 0.4s; transition-delay: 0ms;"
Я хочу создать функцию, которая будет анализировать строку и возвращать следующее:
Выход:
"position: absolute; left: 33.999%; top: 835px;"
Обновлено:
Вот моя попытка, но какой способ сделать это более эффективно?
let str = 'position: absolute; left: 33.999%; top: 835px; opacity: 1; transition-property: opacity, transform; transition-duration: 0.4s; transition-delay: 0ms;';
let keys = ['opacity', 'transition'];
function cleanStr(str, keys) {
let splitStr = str.split(';');
let matchingItems = [];
for (let a = 0; a < splitStr.length; a++) {
for (let b = 0; b < keys.length; b++) {
if (splitStr[a].search(keys[b]) !== -1) {
if (matchingItems.indexOf(splitStr[a]) === -1) {
matchingItems.push(splitStr[a]);
}
}
}
}
return splitStr.filter((filteredStr) => {
return matchingItems.indexOf(filteredStr) === -1;
}).join('; ')
}
cleanStr(str, keys);
Вот кодовый ключ.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Решение O (n) заключалось бы в создании объекта, отражающего правила, удалении соответствующих ключей и последующей строковой обработке вывода:
const cleanStr = (str, keys) => {
const rules = str.split(';').reduce((rules, rule) => {
const match = rule.match(/(\w+):\s*(\w+)/);
if (match) {
const [_, name, value] = match;
rules[name] = value
}
return rules;
}, {});
keys.forEach(key => delete rules[key]);
return Object.entries(rules).reduce((str, [key, value]) => `${str} ${key}: ${value};`, "");
};
const str = 'position: absolute; left: 33.999%; top: 835px; opacity: 1; transition-property: opacity, transform; transition-duration: 0.4s; transition-delay: 0ms;';
const keys = ['opacity', 'transition'];
console.info(cleanStr(str, keys));Теперь, на всякий случай, вы можете использовать карту ES2015, поскольку ключи потенциально являются произвольным (небезопасным) вводом:
const cleanStr = (str, keys) => {
const items = str.split(';').map(rule => {
const match = rule.match(/(\w+):\s*(\w+)/);
return match ? [match[1], [match[2]]] : null;
}).filter(v => !!v);
const rules = new Map(items);
keys.forEach(key => rules.delete(key));
return [...rules].reduce((str, [key, value]) => `${str} ${key}: ${value};`, "");
}
const str = 'position: absolute; left: 33.999%; top: 835px; opacity: 1; transition-property: opacity, transform; transition-duration: 0.4s; transition-delay: 0ms;';
const keys = ['opacity', 'transition'];
console.info(cleanStr(str, keys));Спасибо за ответ! Я думаю, что оба решения надежны, однако ожидаемый результат еще не совсем достигнут. Я обновил вопрос, чтобы включить вывод.
Они динамически добавляются сторонним плагином во время анимации, но плагин не может удалить их после завершения анимации.