假设我有一个对象,
const emailCount = {'vik@g.com':4,'sri@y.com':9}
我有一个对象数组,
const emailDetails = [{'emailId': 'vik@g.com','name':'Alision', 'subject':'hello'},{'emailId':'sri@y.com','name':'Hanumant', 'subject':'ola'},
{'emailId':'ally@o.com','name':'Brian', 'subject':'namaste'},{'emailId':'vik@g.com','name':'Alision', 'subject':'hello'}]
可以有多个具有相同 emailId 的条目。
所以我想做的是用 emailDetails 中的名称替换 key,即 emailCount 中的 emailId。
emailDetails 中 emailId 的名称,无论有多少条目将始终保持不变。
我的预期 O/P 是:{'Alision':4,'Hanumant': 9}
如何将 emailCount 中的密钥替换为 emailDetails 的 emailId 中的名称作为密钥?我尝试寻找解决方案,但无法找到任何重新安装的内容。如果有人需要任何进一步的细节,请让我。
答案 0 :(得分:2)
基本上如果你想对它进行分组和计数,你可以使用Array.reduce
var groupByCount = (arrayData, key) => {
return arrayData.reduce( (r, a) => {
r[a[key]] = r[a[key]] || 0 ;
r[a[key]] ++;
return r;
}, Object.create(null));
}
使用
const emailDetails = [{'emailId': 'vik@g.com','name':'Alision', 'subject':'hello'},{'emailId':'sri@y.com','name':'Hanumant', 'subject':'ola'},
{'emailId':'ally@o.com','name':'Brian', 'subject':'namaste'},{'emailId':'vik@g.com','name':'Alision', 'subject':'hello'}]
groupByCount(emailDetails, 'name'); // {Alision: 2, Hanumant: 1, Brian: 1}
groupByCount(emailDetails, 'emailId'); // {vik@g.com: 2, sri@y.com: 1, ally@o.com: 1}
groupByCount(emailDetails, 'subject'); // {hello: 2, ola: 1, namaste: 1}
答案 1 :(得分:1)
我把一个简单的例子和注释放在一起,解释了在脚本中移动时发生了什么。
const emailCount = {'vik@g.com':4,'sri@y.com':9}
const emailDetails = [
{'emailId': 'vik@g.com','name':'Alision', 'subject':'hello'},
{'emailId':'sri@y.com','name':'Hanumant', 'subject':'ola'},
{'emailId':'ally@o.com','name':'Brian', 'subject':'namaste'},
{'emailId':'vik@g.com','name':'Alision', 'subject':'hello'}
]
// Create the object that we're going to store the output in
const output = {}
// Loop through the emailCount object in [[email, count]] format
Object.entries(emailCount)
.forEach((emailCountEntry) => {
const [email, count] = emailCountEntry
// Filter through our second input object and return any entries that match the given email
const selected = emailDetails.filter(details => details.emailId === email)
// If one was found, add it to our output
if (selected.length) {
output[selected[0].name] = count
}
})
console.log(output)
以后,请尝试将您已经尝试过的任何内容与您的代码一起包含在问题中。在此处发布问题之前,这有助于表明您已努力解决问题。
答案 2 :(得分:1)
const output = {};
Object.entries(emailCount).forEach(([key, value]) => {
output[emailDetails.find(item => item.emailId === key).name] = value;
})
注意:尚未进行未定义的检查,此代码需要微调,但这里是总体思路
JSFiddle:https://jsfiddle.net/L0o4x86e/
答案 3 :(得分:1)
如果我理解正确,您只想替换 emailCount
的键,而不是创建另一个对象或进行任何额外的计数。
如果是这样,您可以mutate the emailCount
object:
const emailCount = {'vik@g.com': 4, 'sri@y.com': 9}
const emailDetails = [{'emailId': 'vik@g.com', 'name': 'Alision', 'subject': 'hello'}, {'emailId': 'sri@y.com', 'name': 'Hanumant', 'subject': 'ola'}, {'emailId': 'ally@o.com', 'name': 'Brian', 'subject': 'namaste'}, {'emailId': 'vik@g.com', 'name': 'Alision', 'subject': 'hello'}]
for (emailId in emailCount) {
const name = emailDetails.find(x => x.emailId === emailId).name
delete Object.assign(emailCount, {[name]: emailCount[emailId]})[emailId]
}
console.log(emailCount)
答案 4 :(得分:1)
aggfunc=
使用单个循环的简单解决方案。如果在该 emailId 的 emailCount 对象中找到匹配项,请将其复制到新密钥中并删除电子邮件密钥。