Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
36 / 3 / 1
Регистрация: 30.06.2016
Сообщений: 93

Нужно написать функцию на ECMAScript 5 по сортировке и объединению двух массивов

11.01.2019, 15:18. Показов 1798. Ответов 5

Студворк — интернет-сервис помощи студентам
Есть серверное приложения (на JAVA написано) на котором можно запускать скрипты JS (ECMAScript).
Есть два JSON файла.

Первый JSON
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{"JOB": {"Inks": {"ink": [
    {
        "Angle": 37,
        "Frequency": 175,
        "InkParam": "новый",
        "ID": 1,
        "ColorName": "Black"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "новый",
        "ID": 2,
        "ColorName": "PANTONE  427 C"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "старый",
        "ID": 3,
        "ColorName": "Cyan"
    }
]}}}

Второй JSON
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{"JOB": {"Inks": {"Ink": [
    {
        "ID": 1,
        "ColorName": "Cyan"
    },
    {
        "ID": 2,
        "ColorName": "Black"
    },
    {
        "ID": 3,
        "ColorName": "PANTONE 427 C"
    }
]}}}
Нужно из первого списка вставить во второй InkParam. Но оба списка по разному отсортированы/имеют разный порядок. Совпадают только ColorName.
На выходе требуется получить изменённый второй список:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{"JOB": {"Inks": {"Ink": [
    {
        "ID": 1,
        "InkParam": "старый",
        "ColorName": "Cyan"
    },
    {
        "ID": 2,
        "InkParam": "новый",
        "ColorName": "Black"
    },
    {
        "ID": 3,
        "InkParam": "новый",
        "ColorName": "PANTONE 427 C"
    }
]}}}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.01.2019, 15:18
Ответы с готовыми решениями:

Нужно написать функцию по сортировке дат
Есть список дат 2014-3-9 2014-3-10 2014-3-11 2014-3-12 2014-3-16 2014-3-17 2014-3-18 2014-3-19

Написать функцию находящую количество общих элементов двух массивов
Даны два массива целых чисел упорядоченные по невозрастанию. Написать функцию находящую количество общих элементов

Написать функцию, определяющую в каком из двух массивов больше отрицательных элементов
Даны два массива из N чисел в каждом. Написать функцию, определяющую в каком из массивов больше отрицательных элементов. Массивы...

5
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
11.01.2019, 16:54
Spirit412, у вас ошибка в
Цитата Сообщение от Spirit412 Посмотреть сообщение
Первый JSON
JavaScript
1
 "ColorName": "PANTONE  427 C"
лишний пробел после PANTONE, исправьте, иначе код не будет работать корректно
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var obj1 = {"JOB": {"Inks": {"ink": [
    {
        "Angle": 37,
        "Frequency": 175,
        "InkParam": "новый",
        "ID": 1,
        "ColorName": "Black"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "новый",
        "ID": 2,
        "ColorName": "PANTONE 427 C"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "старый",
        "ID": 3,
        "ColorName": "Cyan"
    }
]}}};
var obj2 = {"JOB": {"Inks": {"Ink": [
    {
        "ID": 1,
        "ColorName": "Cyan"
    },
    {
        "ID": 2,
        "ColorName": "Black"
    },
    {
        "ID": 3,
        "ColorName": "PANTONE 427 C"
    }
]}}};
 
function setInkParam(arr1, arr2, commonProperty, settableProperty) {
    for(var i = 0; i < arr1.length; i++){
        for(var j = 0; j < arr2.length; j++){
            if(arr1[i][commonProperty] == arr2[j][commonProperty])
                arr2[j][settableProperty] = arr1[i][settableProperty];
        }
    }
}
 
setInkParam(obj1.JOB.Inks.ink, obj2.JOB.Inks.Ink, 'ColorName', 'InkParam');
console.log(obj2);
/*
0: {ID: 1, ColorName: "Cyan", InkParam: "старый"}
1: {ID: 2, ColorName: "Black", InkParam: "новый"}
2: {ID: 3, ColorName: "PANTONE 427 C", InkParam: "новый"}
*/
0
36 / 3 / 1
Регистрация: 30.06.2016
Сообщений: 93
11.01.2019, 17:30  [ТС]
На сервере, JS могу запускать только в качестве функции которая что-то возвращает.
JavaScript
1
2
3
4
5
6
function f ()
  {
  return "hello";
  }
 
f ();
На выходе нужны строки, тогда я смогу вывести значения
return obj2 + "\n";


К примеру, вот такой код у меня выводит последовательно ColorName:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function f ()
  {
 var contact =   
[
    {
        "Angle": 37,
        "Frequency": 175,
        "InkParam": "новый",
        "ID": 1,
        "ColorName": "Black"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "новый",
        "ID": 2,
        "ColorName": "PANTONE  427 C"
    },
    {
        "Angle": 37,
        "Frequency": 150,
        "InkParam": "новый",
        "ID": 3,
        "ColorName": "Cyan"
    }
];
 
 
 var filter = {"ColorName":""}
 
 function junction(value, index)
   {
   for (var __ in filter) if(value[__]) return value[__]
   } 
 
var island = contact.map(junction);
 
  return island + "\n";
  }
 
f ();
0
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
11.01.2019, 17:55
нужно чтобы функция возвращала объект?
подкостылил немного
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
function setInkParam(ob1, ob2, commonProperty, settableProperty){
    var arr1 = ob1.JOB.Inks.ink, arr2 = ob2.JOB.Inks.Ink;
    for(var i = 0; i < arr1.length; i++){
        for(var j = 0; j < arr2.length; j++){
            if(arr1[i][commonProperty] == arr2[j][commonProperty]){
                arr2[j][settableProperty] = arr1[i][settableProperty];
                break;
            }
        }
    }
    return ob2;
}
console.log(setInkParam(obj1, obj2, 'ColorName', 'InkParam'));
0
36 / 3 / 1
Регистрация: 30.06.2016
Сообщений: 93
14.01.2019, 17:14  [ТС]
Пытаюсь в конселн Хрома проверить код.
Выдаёт андефаиндет

Меня бы и такой вариант устроил:
0: {ID: 1, ColorName: "Cyan", InkParam: "старый"}
1: {ID: 2, ColorName: "Black", InkParam: "новый"}
2: {ID: 3, ColorName: "PANTONE 427 C", InkParam: "новый"}



Сам пока пытаюсь разобраться.

Вот пример:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function f ()
  {
    var myObj, i, j, x = "";
 
     var ColorFile = {"Ink": [
    {
        "ID": 1,
        "ColorName": "Cyan"
    },
    {
        "ID": 2,
        "ColorName": "Black"
    },
    {
        "ID": 3,
        "ColorName": "PANTONE 427 C"
    }
]}
 
 
 
var color1 = '<JOB><Inks><Ink ID="'+ColorFile.Ink[0].ID+'"' +' ColorName="'+  ColorFile.Ink[0].ColorName + '"'+ '>/Ink>' + "\n" 
+ '<JOB><Inks><Ink ID="'+ColorFile.Ink[1].ID+'"' +' ColorName="'+  ColorFile.Ink[1].ColorName + '"'+ '>/Ink>' + "\n" +
 '<JOB><Inks><Ink ID="'+ColorFile.Ink[2].ID+'"' +' ColorName="'+  ColorFile.Ink[2].ColorName + '"'+ '>/Ink></Inks></JOB>' 
 
 
 
  return color1 ;
  }
 
f ();
На выходе:
XML
1
2
3
<JOB><Inks><Ink ID="1" ColorName="Cyan">/Ink>
<Ink ID="2" ColorName="Black">/Ink>
<Ink ID="3" ColorName="PANTONE 427 C>/Ink></Inks></JOB>
Это XML, но в принципе и json годен.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
14.01.2019, 17:52
Лучший ответ Сообщение было отмечено Spirit412 как решение

Решение

Поскольку выше уже расписаны obj1 и obj2, повторять их не буду.
Использую механизм JOIN из SQL, соединение произвольных массивов по ключам.
Продолжаю скрипт:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        function f(obj1, obj2) {
            return { "JOB": { "Inks": { "Ink": join(obj2.JOB.Inks.Ink, obj1.JOB.Inks.ink, e => e.ColorName, e => e.ColorName, (e1, e2) => ({ ID: e1.ID, InkParam: e2.InkParam, ColorName: e1.ColorName })) } } };
        };
 
        console.log(f(obj1, obj2));
 
        /**
         * Join() - Внутреннее соединение двух последовательностей по равенству результатов
         * двух функций обратного вызова для первой и второй последовательности.
         * @param {Array} array1 Первая соединяемая последовательность.
         * @param {Array} array2 Вторая соединяемая последовательность.
         * @param {Function} outerKeySelector Функция, возвращающая значение ключа для соединения из первой последовательности.
         * @param {Function} innerKeySelector Функция, возвращающая значение ключа для соединения из второй последовательности.
         * @param {Function} resultSelector Функция, возвращающая элемент результирующей последовательности.
         */
        function join(array1, array2, outerKeySelector, innerKeySelector, resultSelector) {
            var resultArray = [];
            for (var i = 0; i < array1.length; ++i) {
                for (var i2 = 0; i2 < array2.length; ++i2) {
                    if (outerKeySelector(array1[i]) === innerKeySelector(array2[i2]))
                        resultArray.push(resultSelector(array1[i], array2[i2]));
                }
            }
            return resultArray;
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2019, 17:52
Помогаю со студенческими работами здесь

Написать функцию, которая найдет произведение двух матриц, заданных в виде массивов. Предусмотреть проверку корректности
Написать функцию, которая найдет произведение двух матриц, заданных в виде массивов. Предусмотреть проверку корректности ввода исходных...

Написать функцию, которая почленно заключает первые четыре элемента двух заданных как параметры массивов типа double
Написать функцию, которая почленно заключает первые четыре элемента двух заданных как параметры массивов типа double, помещая результаты в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru