Сравнение значений в одном JavaScript массиве объектов - PullRequest
0 голосов
/ 10 марта 2020

У меня есть массив объектов, таких как:

[{ value: 40,
  username: 'Name 1',
  id: 'high'
},
{ value: 30,
  username: 'Name 2',
  id: 'low',
},
{ value: 60,
  username: 'Name 1',
  id: 'low',
},
{ value: 50,
  username: 'Name 2',
  id: 'high'
}]

Я хочу сравнить объекты с тем же ключом username и вернуть false, если у объекта есть свойство id: low и его value выше любого соответствующего объекта с id, установленным на high.

Так что для этого объекта будет возвращено false , поскольку третий объект имеет low для своего идентификатора и он имеет более высокое значение, чем соответствующий объект с тем же именем пользователя с high в его идентификаторе.

В настоящее время я фильтрую массив в два отдельных массива следующим образом.

    const higherTest = test.filter(item => item.id === 'high');
    const lowerTest = test.filter(item => item.id === 'low');

А затем сравните оба, используя вложенное для l oop, но это кажется чрезмерным, и мне интересно, есть ли более чистый способ?

1 Ответ

1 голос
/ 10 марта 2020

Вы можете взять таблицу ha sh для посещенных имен и сохранить значение минимума и высоты. Если пара найдена, проверьте значения и верните результат проверки.

Этот подход использует короткое замыкание и возвращает первое найденное low > high условие.

var data = [{ value: 40, username: 'Name 1', id: 'high' }, { value: 30, username: 'Name 2', id: 'low' }, { value: 60, username: 'Name 1', id: 'low' }, { value: 50, username: 'Name 2', id: 'high' }],
    result = !data.some((m => ({ value, username, id }) => {
        const user = m[username] = m[username] || {};
        user[id] = value;
        return 'high' in user && 'low' in user && user.low > user.high;
    })({}));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...