Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сравнить два массива с объектами и удалить совпадения (https://javascript.ru/forum/misc/75570-sravnit-dva-massiva-s-obektami-i-udalit-sovpadeniya.html)

Роман Андреевич 21.10.2018 11:35

Сравнить два массива с объектами и удалить совпадения
 
Коллеги, прошу прощения за глупый вопрос, но сижу туплю не могу решить вопрос.

Есть два массива с объектами:

let categories = [
			{"id": 1, "title": "Комплектующие", "pid": null},
			{"id": 2, "title": "Ноутбуки", "pid": null},
			{"id": 3, "title": "Сумки под ноутбуки", "pid": 2},
			{"id": 4, "title": "Сумки мужские", "pid": 3},
			{"id": 5, "title": "Cумки мужские синие", "pid": 4},
			{"id": 6, "title": "Жесткие диски", "pid":1},
			{"id": 7, "title": "Кабеля", "pid":1},
			{"id": 8, "title": "Кабеля HDMI", "pid": 7},
			{"id": 9, "title": "Мониторы", "pid": null},
			{"id": 10, "title": "Кабеля HDMI mini", "pid": 8},
			{"id": 11, "title": "Сумки женские", "pid": 3},
			{"id": 12, "title": "Сумки мужские синие с рюшечками", "pid": 5},
    	];

let targets = [{"id": 7, "title": "Кабеля", "pid":1},
			{"id": 8, "title": "Кабеля HDMI", "pid": 7},
			{"id": 9, "title": "Мониторы", "pid": null},]


Нужно сравнить массивы и удалить совпадения))))) Как сделать????

рони 21.10.2018 11:44

Роман Андреевич,
преобразовать обьекты в строки, отфильтровать, сделать из строк обьекты.

Роман Андреевич 21.10.2018 11:47

рони, благодарю за помощь, а можно пример))))))))))))))

Роман Андреевич 21.10.2018 11:47

рони, щас попробую

Роман Андреевич 21.10.2018 11:48

let result = arrayTarget.filter((item) => {

				return JSON.stringify(arrayElements).indexOf(JSON.stringify(item)) === -1;

			});


вроде работает))))))))

рони 21.10.2018 11:55

Роман Андреевич,
let categories = [
			{"id": 1, "title": "Комплектующие", "pid": null},
			{"id": 2, "title": "Ноутбуки", "pid": null},
			{"id": 3, "title": "Сумки под ноутбуки", "pid": 2},
			{"id": 4, "title": "Сумки мужские", "pid": 3},
			{"id": 5, "title": "Cумки мужские синие", "pid": 4},
			{"id": 6, "title": "Жесткие диски", "pid":1},
			{"id": 7, "title": "Кабеля", "pid":1},
			{"id": 8, "title": "Кабеля HDMI", "pid": 7},
			{"id": 9, "title": "Мониторы", "pid": null},
			{"id": 10, "title": "Кабеля HDMI mini", "pid": 8},
			{"id": 11, "title": "Сумки женские", "pid": 3},
			{"id": 12, "title": "Сумки мужские синие с рюшечками", "pid": 5}
    	];

let targets = [{"id": 7, "title": "Кабеля", "pid":1},
			{"id": 8, "title": "Кабеля HDMI", "pid": 7},
			{"id": 9, "title": "Мониторы", "pid": null}]
let arrTarget = targets.map(JSON.stringify);
let arrOut =  categories.map(JSON.stringify).filter(e => !arrTarget.includes(e)).map(JSON.parse);

console.log(arrOut)

laimas 21.10.2018 11:58

Роман Андреевич,
а источник этих объектов кто?

Aetae 21.10.2018 12:04

Ну ересь же, нельзя так делать.

И даже не из-за рекурсивных объектов.
var a = {};
a.b = a;
try{JSON.stringify(a)}catch(e){alert(e)}

И не из-за объектов с иным порядком.
var a = {};
var b = {};
a.c = 1;
a.d = 2;
b.d = 2;
b.c = 1;
alert(JSON.stringify(a) + '\n' + JSON.stringify(b))

А просто потому, что это мерзко: гонять туда-сюда сложные преобразования, вместо того чтоб написать лишних пару строк.

Роман Андреевич 21.10.2018 12:05

laimas, источник БД, получаем основные категории а потом редактируем список (удаляем добавляем изменяем ...). Что то типа теста

Роман Андреевич 21.10.2018 12:06

Aetae, вообще нельзя такое делать. Просто стояла задача))))))))))))

рони 21.10.2018 12:17

Aetae,
:) ок
let categories = [
			{"id": 1, "title": "Комплектующие", "pid": null},
			{"id": 2, "title": "Ноутбуки", "pid": null},
			{"id": 3, "title": "Сумки под ноутбуки", "pid": 2},
			{"id": 4, "title": "Сумки мужские", "pid": 3},
			{"id": 5, "title": "Cумки мужские синие", "pid": 4},
			{"id": 6, "title": "Жесткие диски", "pid":1},
			{"id": 7, "title": "Кабеля", "pid":1},
			{"id": 8, "title": "Кабеля HDMI", "pid": 7},
			{"id": 9, "title": "Мониторы", "pid": null},
			{"id": 10, "title": "Кабеля HDMI mini", "pid": 8},
			{"id": 11, "title": "Сумки женские", "pid": 3},
			{"id": 12, "title": "Сумки мужские синие с рюшечками", "pid": 5}
    	];

let targets = [{"id": 7, "title": "Кабеля", "pid":1},
			{"id": 8, "title": "Кабеля HDMI", "pid": 7},
			{"id": 9, "title": "Мониторы", "pid": null}]

let arrOut =  categories.filter(e => targets.every(k => k.id != e.id));

console.log(arrOut)

Aetae 21.10.2018 12:36

рони, ну да, как-то так:
let categories = [
    {"id": 1, "title": "Комплектующие", "pid": null},
    {"id": 2, "title": "Ноутбуки", "pid": null},
    {"id": 3, "title": "Сумки под ноутбуки", "pid": 2},
    {"id": 4, "title": "Сумки мужские", "pid": 3},
    {"id": 5, "title": "Cумки мужские синие", "pid": 4},
    {"id": 6, "title": "Жесткие диски", "pid":1},
    {"id": 7, "title": "Кабеля", "pid":1},
    {"id": 8, "title": "Кабеля HDMI", "pid": 7},
    {"id": 9, "title": "Мониторы", "pid": null},
    {"id": 10, "title": "Кабеля HDMI mini", "pid": 8},
    {"id": 11, "title": "Сумки женские", "pid": 3},
    {"id": 12, "title": "Сумки мужские синие с рюшечками", "pid": 5},
  ];

  let targets = [{"id": 7, "title": "Кабеля", "pid":1},
                 {"id": 8, "title": "Кабеля HDMI", "pid": 7},
                 {"id": 9, "title": "Мониторы", "pid": null},]

  function filterObjectArray(array, exclude, keys){
    if(keys){
      function filter(first){
        return !exclude.some(
          second => keys.every(
            key => first[key] === second[key]
          )
        )
      }
    }else{
      function filter(first){       
        const keysLength = Object.keys(first).length;
        return !exclude.some(
          second => keysLength === (keys = Object.keys(second)).length 
          && keys.every(
            key => first[key] === second[key]
          )
        )
      }
    }

    return array.filter(filter)
  }

  filterObjectArray(categories, targets, ['id']);
  filterObjectArray(categories, targets);

laimas 21.10.2018 12:38

Цитата:

Сообщение от Роман Андреевич
источник БД, получаем основные категории а потом редактируем список

Что же вам мешает в запросе указать выборку только уникальных значений? Вы загодя лишнее получаете, чтобы потом еще и клиента нагружать пустой работой.

Роман Андреевич 25.10.2018 06:42

laimas, ничего не мешает, в реалиях так и делается))) Тут тестовое задание


Часовой пояс GMT +3, время: 07:09.