Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сравнить элементы массива 2 (https://javascript.ru/forum/misc/76209-sravnit-ehlementy-massiva-2-a.html)

Роман Андреевич 13.12.2018 12:31

Сравнить элементы массива 2
 
коллеги, доброго времени суток. опять ступор. Походу надо в отпуск.

Итак)))))))
Мне приходят объекты вида:

let ob = {
    id: ...
    data: ...
}


Все это добро упаковываю в массив searchArray. Не могу сделать фильтр для сравнения нового объекта с элементами массива:

let this.searchList = [];

	checkMatches(data) {

		if (this.searchList.length === 0 || data === null) {

			this.searchList.push(data);

		} else {

			this.searchList.forEach((item) => {

				if (item === null) return;
				if (item.id === data.id) return;

				this.searchList.push(data);

			});

		}

	}


null - это тоже результат от сервера, его нужно учитывать. Нужно добавлять объекты, только если data.id !== item.id, при наличии item.id.
По факту после 2 элемента в this.searchList добавляется по несколько элементов за раз.

please help!!!!! заранее благодарю

Nexus 13.12.2018 12:47

const push = (function() {
    const container = [];
    const alreadyInContainerIndex = {};

    const checkItem = function(item) {
        return item === null || !alreadyInContainerIndex[item.id];
    };

    return function(data) {
        if (!checkItem(data))
            return;

        const index = container.push(data) - 1;
        if (data)
            alreadyInContainerIndex[data.id] = index;
    }
})();

рони 13.12.2018 13:09

Роман Андреевич,
let this.searchList = [];

	checkMatches(data) {

		if (this.searchList.length === 0 || data === null) {

			this.searchList.push(data);

		} else {

			this.searchList.every((item) => {

				if (item === null) return true;
				if (item.id !== data.id) return true;

			}) && this.searchList.push(data);

		}

	}

Роман Андреевич 13.12.2018 13:17

коллеги спасибо!!! помогли!!!

Nexus 13.12.2018 13:28

По-моему ваши алгоритмы не оптимальные.
У вас перед добавлением нового элемента сначала нужно пробежаться по всем элементам массива проверив нет ли там уже добавляемого элемента.
Такое себе решение.

Роман Андреевич 13.12.2018 13:34

Nexus, а как по вашему нужно делать????

Клиенту с сервера поступает объект, мне же его нужно где-то хранить, почему нет????

Почему проверять наличие существующего объекта так себе решение??????

Nexus 13.12.2018 13:36

Цитата:

Сообщение от Роман Андреевич
Клиенту с сервера поступает объект, мне же его нужно где-то хранить, почему нет????

Храните, никто не запрещает.

Цитата:

Сообщение от Роман Андреевич
а как по вашему нужно делать????

Пост №2 смотрите, я его не просто так написал.

рони 13.12.2018 13:58

:write:
<script>
const container = [];
const push = (function(container) {

    const alreadyInContainerIndex = {};
    const checkItem = function(item) {
        return alreadyInContainerIndex.hasOwnProperty(item.id);
    };

    return function(data) {
        if (data && checkItem(data)) return;
        container.push(data)
        if (data) alreadyInContainerIndex[data.id] = true
    }
})(container);
push(null);
push(null);
push({id : 1})
push({id : 1})
document.write(JSON.stringify(container, null, 4))
  </script>


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