用对象数组中的值替换对象中的键

时间:2021-04-22 05:40:15

标签: javascript node.js

假设我有一个对象,

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 中的名称作为密钥?我尝试寻找解决方案,但无法找到任何重新安装的内容。如果有人需要任何进一步的细节,请让我。

5 个答案:

答案 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 对象中找到匹配项,请将其复制到新密钥中并删除电子邮件密钥。