JavaScript Object loop - Фильтруйте и покажите дубликаты один раз - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть некоторый код, который работает примерно так:

var date = new Date();
var userMessage = {
    UserName: "Charlie",
    LastOnline: date.toDateString(),
    Name: "Charlie"
};
Object.keys(userMessage).forEach(function(user) {
   if (userMessage[user] == "Charlie") {
     document.write("Welcome Charlie!");
   }
});

Однако это работает нормально, но я бы хотел, чтобы в документе было написано "Добро пожаловать, Чарли!"один раз.Вполне возможно, что у пользователя будет одно и то же поле дважды. Как бы я ограничил это до одного раза?

Скоро эта функция будет обернута угловым JS-повторением.Может быть, это можно сделать один раз с фильтром?

Fiddle Link: https://jsfiddle.net/dj5ka4g6/1/

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Вы можете использовать [].some для итерации, пока не найдете хотя бы одно правильное значение:

var date = new Date();
var userMessage = {
    UserName: "Charlie",
    LastOnline: date.toDateString(),
    Name: "Charlie"
};
Object.keys(userMessage).some(function(user) {
   if (userMessage[user] == "Charlie") {
     console.log("Welcome Charlie!");
     return true;
   }
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

0 голосов
/ 26 ноября 2018

Просто используйте старый для цикла.

const users = Object.keys(userMessage).map((key) => userMessage[key]);

for (let i = 0; i < users.length; i++) {
  if (users[i] === 'Charlie') {
    console.log(`Welcome ${users[i]}`);
    break;
  }
}
0 голосов
/ 26 ноября 2018

Один из вариантов - получить значения объекта с помощью Object.values, выполнить дедупликацию с помощью Set, а затем выполнить итерацию:

var date = new Date();
var userMessage = {
  UserName: "Charlie",
  LastOnline: date.toDateString(),
  Name: "Charlie"
};

[...new Set(Object.values(userMessage))]
  .forEach((val) => {
    if (val === 'Charlie') console.log('Welcome Charlie');
  });

Или, если, как кажется из вашего кода, вы просто проверяете, включен ли Charlie в значения, используйте метод .includes:

var date = new Date();
var userMessage = {
  UserName: "Charlie",
  LastOnline: date.toDateString(),
  Name: "Charlie"
};

if (Object.values(userMessage).includes('Charlie')) {
  console.log('Welcome Charlie');
}

Если вам нужен только дедуплицированный массив, то:

var date = new Date();
var userMessage = {
  UserName: "Charlie",
  LastOnline: date.toDateString(),
  Name: "Charlie"
};

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