dima9595
@dima9595
Junior PHP

Как спарсенный JSON Объект сравнить по определённым полям в другом JSON объекте?

Все доброго времени суток.

Подскажите куда копать, а то так и не пойму.

Задача:
Есть 2 XML файла примерно одинакового содержания, различные только параметры, возможно каких-то свойств нет. Нужно сравнить эти type'ы по названиям, lifetime и т.п (список свой, настраиваемый). И записать в документ.

Примеры:
1-ый файл

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<types>
    <type name="ACOGOptic">
        <nominal>15</nominal>
        <lifetime>7200</lifetime>
        <restock>1800</restock>
        <min>8</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/>
    </type>
    <type name="AK101">
        <nominal>5</nominal>
        <lifetime>10800</lifetime>
        <restock>1800</restock>
        <min>2</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="1" count_in_hoarder="1" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/>
        <value name="Tier4"/>
    </type>
    <type name="AK101_Black">
        <nominal>0</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>0</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="1" deloot="0"/>
        <category name="weapons"/>
    </type>



2-ой файл

<type name="ACOGOptic">
        <nominal>15</nominal>
        <lifetime>17200</lifetime>
        <restock>11800</restock>
        <min>3</min>
        <quantmin>-1</quantmin>
        <quantmax>-2</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/>
    </type>
    <type name="AK101">
        <nominal>5</nominal>
        <lifetime>10800</lifetime>
        <restock>1800</restock>
        <min>2</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="1" count_in_hoarder="1" count_in_map="0" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/>
        <value name="Tier4"/>
    </type>
    <type name="AK101_Black">
        <nominal>0</nominal>
        <lifetime>10600</lifetime>
        <restock>0</restock>
        <min>1</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="1" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="1" deloot="0"/>
        <category name="weapons"/>
    </type>
    <type name="AK101_Green">
        <nominal>0</nominal>
        <lifetime>12800</lifetime>
        <restock>0</restock>
        <min>0</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="1" deloot="0"/>
        <category name="weapons"/>
    </type>



Спарсить из XML в JSON я смог. Смог определить какие имена есть, а каких нет. А вот как по другим параметрам сравнить я так и не могу понять.

Собственно код:
static comareFiles(newFile, oldFile) {
    // Первый файл
    var newFileCompare = this.compareFile(newFile);
    var newFileCompareParse = JSON.parse(newFileCompare);
    var newFileCompareParse = newFileCompareParse.types.type;

    // Второй файл
    var oldFileCompare = this.compareFile(oldFile);
    var oldFileCompareParse = JSON.parse(oldFileCompare);
    var oldFileCompareParse = oldFileCompareParse.types.type;

    newFileCompareParse.forEach((element, count) => {
      let searchName = element.attributes.name;

      // Сравнение по именам
      let nameSearching = oldFileCompareParse.find(
        (oldFile) => oldFile.attributes.name === searchName
      );

      if (!nameSearching) {
        console.log("Не найдено: " + element.attributes.name);
      }
    });
  }


Пример JSON после парсинга:
[
  {
    attributes: { name: 'AKM' },
    lifetime: { text: 10800 },
    restock: { text: 1800 },
    quantmin: { text: -1 },
    quantmax: { text: -1 },
    cost: { text: 100 },
    flags: { attributes: [Object] },
    category: { attributes: [Object] }
  },
  {
    attributes: { name: 'AKS74U' },
    lifetime: { text: 10800 },
    restock: { text: 1800 },
    quantmin: { text: -1 },
    quantmax: { text: -1 },
    cost: { text: 100 },
    flags: { attributes: [Object] },
    category: { attributes: [Object] }
  }
]


Подскажите пожалуйста примерный алгоритм. Заранее спасибо!)
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 1
@McBernar
Записать в файл на js вы не сможете (если только вы не в ноде работаете), а сравнить можно в цикле с помощью hasOwnProperty.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект