вставить значения в формате массива для ключа в объекте в JavaScript - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь преобразовать массив (с адресами электронной почты) в объект.Как вставить значения в массив значений для одного ключа?

var list = [
  "john@yahoo.com", "rami@gmail.com",
  "josh@yahoo.com", "bale@gmail.com"
];

(function() {
  var obj1 = {};
  for (var a = 0, b = list.length; b > a; a++) {
    var str = list[a].split("@");
    var arr = [];
    arr.push(str[0]);
    if (!(str[1] in obj1)) {
      obj1[str[1]] = []; //arr.push(str[0])];
    }

    Object.values(obj1[str[1]]).push(str[0])

  };
  console.log(obj1);
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
ожидаемый результат
    {
    "gmail.com" : ["a","b","c"],
    "yahoo.com" : ["de","e","f"]
    }

Я также хочу добавить как

    {
    "gmail.com" : [3],//1+1+1
    "yahoo.com" : [4]//1+1+1+1
    }

Ответы [ 4 ]

0 голосов
/ 13 июня 2018

Array.prototype.reduce обычно используется для перевода array данных в object форму.

Ниже приведен практический пример ?

// Emails.
const emailAddresses = ["bale@gmail.com", "john@yahoo.com", "rami@gmail.com","josh@yahoo.com"]

// Group By Domain.
const groupByDomain = addresses => addresses.reduce((acc, email) => {
  const [prefix, domain] = email.split(/@/)
  const exists = acc[domain]
  if (exists) acc[domain].push(email)
  else acc[domain] = [email]
  return acc
}, {})

// Output.
const output = groupByDomain(emailAddresses)

// Proof.
console.log(output)
0 голосов
/ 13 июня 2018

Вы можете просто вставить значения в массив, если ключ найден в объекте, иначе добавьте массив

var list = [
  "john@yahoo.com", "rami@gmail.com",
  "josh@yahoo.com", "bale@gmail.com"
];

(function() {
  var obj1 = {};
  for (var a = 0; a < list.length;  a++) {
    var str = list[a].split("@");
    if(obj1[str[1]]) {
        obj1[str[1]].push(list[a])
    } else {
        obj1[str[1]] = [list[a]]; //arr.push(str[0])];
    }
  };
  console.log(obj1);
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
0 голосов
/ 13 июня 2018

Ваш код почти правильный, есть только небольшая ошибка, измените вашу строку:

Object.values(obj1[str[1]]).push(str[0])

На

obj1[str[1]].push(list[a]);

И он отлично работает.

var list = [
  "john@yahoo.com", "rami@gmail.com",
  "josh@yahoo.com", "bale@gmail.com"
];

(function() {
  var obj1 = {};
  for (var a = 0, b = list.length; b > a; a++) {
    var str = list[a].split("@");
    var arr = [];
    arr.push(str[0]);
    if (!(str[1] in obj1)) {
      obj1[str[1]] = []; //arr.push(str[0])];
    }

    obj1[str[1]].push(list[a]);

  };
  console.log(obj1);
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
0 голосов
/ 13 июня 2018

var list = [
  "john@yahoo.com", "rami@gmail.com",
  "josh@yahoo.com", "bale@gmail.com"
];
obj = {};
list.map(x => x.split('@')[1]).forEach(x => obj[x] = [])
list.forEach(email => obj[email.split('@')[1]].push(email))
console.log(obj)
/*
{
  "yahoo.com": [
"john@yahoo.com",
"josh@yahoo.com"
  ],
  "gmail.com": [
"rami@gmail.com",
"bale@gmail.com"
  ]
}
*/

Объяснение : создан пустой объект obj.Затем я повторил на list и извлек все домены на list.map(x => x.split('@')[1]).

Имея домены в руках, я настроил объект так, чтобы он имел структуру { 'yahoo.com': [], 'gmail.com': [] }

Затем я снова повторил список и добавил электронное письмо, если домен содержал соответствующую часть, давая результирующий объект.

Редактировать : Это также можно сделать за одну итерацию следующим образом:

var list = [
  "john@yahoo.com", "rami@gmail.com",
  "josh@yahoo.com", "bale@gmail.com"
]
obj = {}
list.forEach(email => {
  let domain = email.split('@')[1]
  if (!obj[domain]) obj[domain] = []
  if (obj[domain].indexOf(email) < 0) obj[domain].push(email)
})
console.log(obj)

Здесь я перебираю список, извлекаю домен, устанавливаю ключ с [], если его не существует, и затем помещаю в него электронное письмо.Это также гарантирует, что дубликаты электронных писем не будут отправлены.

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