Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.12.2018, 12:31
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

Сравнить элементы массива 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!!!!! заранее благодарю
Ответить с цитированием
  #2 (permalink)  
Старый 13.12.2018, 12:47
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

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;
    }
})();
Ответить с цитированием
  #3 (permalink)  
Старый 13.12.2018, 13:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Роман Андреевич,
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:11.
Ответить с цитированием
  #4 (permalink)  
Старый 13.12.2018, 13:17
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

коллеги спасибо!!! помогли!!!
Ответить с цитированием
  #5 (permalink)  
Старый 13.12.2018, 13:28
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

По-моему ваши алгоритмы не оптимальные.
У вас перед добавлением нового элемента сначала нужно пробежаться по всем элементам массива проверив нет ли там уже добавляемого элемента.
Такое себе решение.
Ответить с цитированием
  #6 (permalink)  
Старый 13.12.2018, 13:34
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

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

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

Почему проверять наличие существующего объекта так себе решение??????
Ответить с цитированием
  #7 (permalink)  
Старый 13.12.2018, 13:36
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

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

Сообщение от Роман Андреевич
а как по вашему нужно делать????
Пост №2 смотрите, я его не просто так написал.
Ответить с цитированием
  #8 (permalink)  
Старый 13.12.2018, 13:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070


<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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнить элементы массива Роман Андреевич Общие вопросы Javascript 2 13.12.2018 10:26
Помогите , элементы массива по порядку из другого массива Rost_shat Javascript под браузер 9 28.07.2018 20:03
сравнить два массива Роман Андреевич Общие вопросы Javascript 2 04.10.2017 14:12
Передать элементы php массива в js переменную zav Элементы интерфейса 3 22.11.2016 14:35
Подскажите как сравнить первые элементы многомерного массива? yloboda Элементы интерфейса 3 08.06.2014 15:00