Удалить дубликаты из массива JavaScript с помощью Python - PullRequest
1 голос
/ 24 сентября 2019

Предположим, у меня есть массив элементов JavaScript, который выглядит примерно так:

var oui = new Array({
    "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"
   });

Теперь представьте, что файл очень большой, а некоторые значения "pfx" повторяются по всему набору данных,Очевидно, что ручная дедупликация исключена, поэтому я пытаюсь найти лучший способ подойти к ней программно.Как я могу написать сценарий Python для чтения в файле .JS, содержащем этот набор данных для устранения дублирования и удаления любых дубликатов?Другими словами, я хотел бы прочитать в файле JS, проанализировать массив и создать другой файл JavaScript с аналогичным массивом, но только уникальными значениями для переменной pfx.Я рассмотрел несколько других вопросов о переполнении стека, которые похожи по своей природе, но, похоже, ничто не вполне подходит для этого случая.В моем тестировании Python я редко могу просто получить переменные pfx, чтобы удалить дубликаты, или Python пытается прочитать его как правильный объект JSON (даже без частей «var» и «new Array»).Я должен также отметить, что причина, по которой я делаю дедупликацию в Python над другой функцией JavaScript в файле JS (которую я пробовал в следующих примерах, таких как this ), заключается в том, что она просто раздувает размерJavaScript, который должен быть загружен на страницу.В будущем массив, вероятно, будет продолжать расти - таким образом, чтобы избежать ненужной загрузки JavaScript для сокращения времени отклика страницы, я подумал, что это был шаг, который можно и нужно выполнить в автономном режиме и добавить на страницу.

Для пояснения, вот модель сайта, которую я пытаюсь смоделировать: https://www.wireshark.org/tools/oui-lookup.html. Это очень просто по своей природе.

Спасибо за ваше время и помощь в продвинутом!Я действительно ценю это!

Исследование:

Преобразовать массив Javascript в список Python?

Удалить дублирующиеся значения из массива JS

1 Ответ

1 голос
/ 24 сентября 2019

Поскольку структура не является вложенной, вы можете сопоставить массив с регулярным выражением, затем проанализировать его с помощью 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">.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...