@domanskiy

Как на JS сортировать один список JSON по другому и получить третий?

Изначально есть два XML их конвертирую в JSON т.к. в моём варианте у JS (ECMAScript)нет DOM и нет возможности парсить XML. Но есть поддержка JSON и JSON.parse

Есть два списка JSON.
1й JSON
{"JOB": {"Inks": {"ink": [
    {
        "Angle": 7,
        "Frequency": 150,
        "InkParam": "новая",
        "ID": 1,
        "ColorName": "PANTONE  877 C"
    },
    {
        "Angle": 67,
        "Frequency": 150,
        "InkParam": "новая",
        "ID": 2,
        "ColorName": "PANTONE Bright Red C"
    },
    {
        "Angle": 82,
        "Frequency": 175,
        "InkParam": "новая",
        "ID": 3,
        "ColorName": "Yellow"
    },
    {
        "Angle": 37,
        "Frequency": 175,
        "InkParam": "новый",
        "ID": 4,
        "ColorName": "Black"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "новый",
        "ID": 5,
        "ColorName": "PANTONE  427 C"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "новый",
        "ID": 6,
        "ColorName": "Cyan"
    },
    {
        "Angle": 7,
        "Frequency": 150,
        "InkParam": "новая",
        "ID": 7,
        "ColorName": "Magenta"
    },
    {
        "Angle": 37,
        "Frequency": 175,
        "InkParam": "новая",
        "ID": 8,
        "ColorName": "PANTONE 581 C"
    },
    {
        "Angle": 50,
        "Frequency": 133,
        "InkParam": 180202,
        "ID": 9,
        "ColorName": "PANTONE 7739 C"
    },
    {
        "Angle": 50,
        "Frequency": 150,
        "InkParam": 180201,
        "ID": 10,
        "ColorName": "PANTONE Blue 072 C"
    }
]}}}


2й JSON
{"JOB": {"Inks": {"Ink": [
    {
        "ID": 1,
        "ColorName": "Cyan"
    },
    {
        "ID": 2,
        "ColorName": "Magenta"
    },
    {
        "ID": 3,
        "ColorName": "Yellow"
    },
    {
        "ID": 4,
        "ColorName": "Black"
    },
    {
        "ID": 5,
        "ColorName": "PANTONE 427 C"
    },
    {
        "ID": 6,
        "ColorName": "PANTONE 877 C"
    },
    {
        "ID": 7,
        "ColorName": "PANTONE Bright Red C"
    },
    {
        "ID": 8,
        "ColorName": "PANTONE 7739 C"
    },
    {
        "ID": 9,
        "ColorName": "PANTONE 581 C"
    },
    {
        "ID": 10,
        "ColorName": "PANTONE Blue 072 C"
    }
]}}}


Нужно из первого списка вставить во второй InkParam. Но оба списка по разному отсортированы/имеют разный порядок. Совпадают только ColorName.
На выходе требуется получить:
{"JOB": {"Inks": {"Ink": [
    {
        "ID": 1,
        "InkParam": "новый",
        "ColorName": "Cyan"
    },
    {
        "ID": 2,
        "InkParam": "новая",
        "ColorName": "Magenta"
    },
    {
        "ID": 3,
        "InkParam": "новая",
        "ColorName": "Yellow"
    },
    {
        "ID": 4,
        "InkParam": "новый",
        "ColorName": "Black"
    },
    {
        "ID": 5,
        "InkParam": "новый",
        "ColorName": "PANTONE 427 C"
    },
    {
        "ID": 6,
        "InkParam": "новая",
        "ColorName": "PANTONE 877 C"
    },
    {
        "ID": 7,
        "InkParam": "новая",
        "ColorName": "PANTONE Bright Red C"
    },
    {
        "ID": 8,
        "InkParam": 180202,
        "ColorName": "PANTONE 7739 C"
    },
    {
        "ID": 9,
        "InkParam": "новая",
        "ColorName": "PANTONE 581 C"
    },
    {
        "ID": 10,
        "InkParam": 180201,
        "ColorName": "PANTONE Blue 072 C"
    }
]}}}
  • Вопрос задан
  • 26 просмотров
Пригласить эксперта
Ответы на вопрос 2
dpr
@dpr
frontend developer
Нужно первый массив преобразовать в объект, в котором ключами будут значения из уникального поля, в данном случае ColorName.
Потом пробежаться по второму массиву, и зная на каждой итерации его свойство ColorName достать по этому ключу из первого объекта нужные данные.

let tmp = {};
arr1.forEach(i => tmp[i.ColorName] = i);

const arr3 = arr2.map(i => {...i, InkParam: tmp[i.ColorName].InkParam});
Ответ написан
@domanskiy Автор вопроса
Преобрабовать в объекты. Т.е. привести к виду
var tmp = {
        "Angle": 7,
        "Frequency": 150,
        "InkParam": "новая",
        "ID": 1,
        "ColorName": "PANTONE  877 C"
    },
    {
        "Angle": 67,
        "Frequency": 150,
        "InkParam": "новая",
        "ID": 2,
        "ColorName": "PANTONE Bright Red C"
    },
    {
        "Angle": 82,
        "Frequency": 175,
        "InkParam": "новая",
        "ID": 3,
        "ColorName": "Yellow"
    };


на let выдаёт ошибку.
arr2 - это второй JSON?

Если не сложно, можно готовый вариант на JS написать?
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы