Поскольку структура не является вложенной, вы можете сопоставить массив с регулярным выражением, затем проанализировать его с помощью JSON, удалить дублирующиеся объекты с filter
в Python, а затем заменить на дедуплицированную строку JSON.
Используйте синтаксис литерала массива ([
и ]
) вместо new Array
, чтобы поддерживать чистоту (лучше никогда не использовать new Array
):
import re
import json
str = '''
var oui = [{
"pfx": "000000",
"mask": 24,
"desc": "00:00:00 Officially Xerox, but 0:0:0:0:0:0 is more common"
},{
"pfx": "000001",
"mask": 24,
"desc": "Xerox Xerox Corporation"
},{
"pfx": "000002",
"mask": 24,
"desc": "Xerox Xerox Corporation"
},{
"pfx": "000003",
"mask": 24,
"desc": "Xerox Xerox Corporation"
},{
"pfx": "000004",
"mask": 24,
"desc": "Xerox Xerox Corporation"
},{
"pfx": "000004",
"mask": 24,
"desc": "Let's pretend this is a repeat"
}];
'''
def dedupe(match):
jsonStr = match.group()
list = json.loads(jsonStr)
seenPfxs = set()
def notDupe(obj):
thisPfx = obj['pfx']
if thisPfx in seenPfxs:
return False
seenPfxs.add(thisPfx)
return True
return json.dumps([obj for obj in list if notDupe(obj)])
dedupedStr = re.sub(r'(?s)\[[^\]]+\](?=;)', dedupe, str)
print(dedupedStr)
Вывод:
var oui = [{"pfx": "000000", "mask": 24, "desc": "00:00:00 Officially Xerox, but 0:0:0:0:0:0 is more common"}, {"pfx": "000001", "mask": 24, "desc": "Xerox Xerox Corporation"}, {"pfx": "000002", "mask": 24, "desc": "Xerox Xerox Corporation"}, {"pfx": "000003", "mask": 24, "desc": "Xerox Xerox Corporation"}, {"pfx": "000004", "mask": 24, "desc": "Xerox Xerox Corporation"}];
Если возможно, вы можете подумать о том, чтобы хранить данные в отдельном теге, а не во встроенном Javascript - это будет более понятным.Например, в вашем HTML вместо
var oui = [{
"pfx": "000000",
"mask": 24,
"desc": "00:00:00 Officially Xerox, but 0:0:0:0:0:0 is more common"
},{
рассмотрите что-то вроде
var oui = JSON.parse(document.querySelector('[data-oui').textContent);
console.log(oui);
<script data-oui type="application/json">[{
"pfx": "000000",
"mask": 24,
"desc": "00:00:00 Officially Xerox, but 0:0:0:0:0:0 is more common"
}]</script>
Тогда вам не нужно динамически изменять Javascript, а только тег <script data-oui type="application/json">
.