在 JavaScript 中以数组格式插入对象键的值



>我正在尝试将数组(带有电子邮件地址(转换为对象。 如何在一个键的值数组中插入值?

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
}

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)

在这里,我正在迭代列表,提取域,如果密钥不存在,则使用[]设置密钥,然后将电子邮件推送到其中。它还确保没有推送重复的电子邮件。

如果在对象中找到键,您可以简单地推送数组中的值,否则添加数组

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>

你的代码几乎是正确的,只有一个小错误,换行:

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>

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)

最新更新