javascript - Javascript - 为数组中的每个 javascript 对象添加一个基于另一个现有键/值的新键/值
问题描述
我有一个 javascript 对象数组(长度不定)。
var records =
[
{ query_result_id: 373,
url: 'https://www.example1.com/hheyue',
title: 'title1',
uselesskey3: 'yo',
uselesskey4: 'ya',
max_email_nb_sent: 1 },
{ query_result_id: 375,
url: 'https://www.example2.com',
title: 'title2',
uselesskey3: 'yo',
uselesskey4: 'ya',
max_email_nb_sent: null }
//and so on...]
我今天正在创建一个名为parametersObj的新对象(出于不变性原因保持记录不变),基于记录通过执行一定数量的操作:
var parametersObj = records
//remove useless keys
.map(({
title,uselesskey3, uselesskey4, max_email_nb_sent,
...item
}) => item)
//add new needed keys
.map(s => (
{
...s,
status: process.env.CONTEXT === "production" ? "prod" : "dev",
triggered_at: new Date().toLocaleString()
}
));
这完美地工作。
但是我现在要做的是在创建parametersObj
一个方法时添加上面的代码,在该方法中,在删除无用的键(.map
上面的第一个键)之前,我为每个 javascript 对象添加了一个新键email_nb
,它等于:
0
如果max_email_nb_sent
是null
max_email_nb_sent + 1
如果max_email_nb_sent
是not null
我们执行脚本后parametersObj的期望值应该是:
[
{ query_result_id: 373,
url: 'https://www.example1.com/hheyue',
title: 'title1',
email_nb: 2,
status: "prod",
triggered_at: '2019-9-30 23:11:12'
},
{ query_result_id: 375,
url: 'https://www.example2.com',
title: 'title2',
email_nb: 0,
status: "prod",
triggered_at: '2019-9-30 23:11:12' }
//and so on...]
我可以使用 ES6,如果可能的话,我更喜欢通常更简洁。
我试过这个,但下面的这个不起作用
var parametersObj = records
//adding the new key email_nb
.map(s=> s["email_nb"] = s["max_email_nb_sent"] + 1)
//remove useless keys
.map(({
title,uselesskey3, uselesskey4, max_email_nb_sent,
...item
}) => item)
//add new needed keys
.map(s => (
{
...s,
status: process.env.CONTEXT === "production" ? "prod" : "dev",
triggered_at: new Date().toLocaleString()
}
));
但是随后 parametersObj 变得刚好等于 [1, 1] 这是非常错误的......
一些答案的反馈
试过:
var parametersObj = records
//adding the new key email_nb
.map(item =>
{ ...item,
email_nb: item.max_email_nb_sent ?
item.max_email_nb_sent + 1 : 0
}
)
//remove useless keys
.map(({
title,uselesskey3, uselesskey4, max_email_nb_sent,
...item
}) => item)
//add new needed keys
.map(s => (
{
...s,
status: process.env.CONTEXT === "production" ? "prod" : "dev",
triggered_at: new Date().toLocaleString()
}
));
但我得到错误:
Uncaught SyntaxError: Unexpected token ...
解决方案
您的代码的问题是您返回的对象只有email_nb
属性。您还必须返回其他现有属性。
var parametersObj = records
.map(item => ({ ...item,
"email_nb": item.max_email_nb_sent ? item.max_email_nb_sent + 1 : 0
}))
.map(
//remove useless keys
)
.map(s => (
//add new needed keys
));
现场示例:
var records = [{
query_result_id: 373,
url: 'https://www.example1.com/hheyue',
title: 'title1',
uselesskey3: 'yo',
uselesskey4: 'ya',
max_email_nb_sent: 1
},
{
query_result_id: 375,
url: 'https://www.example2.com',
title: 'title2',
uselesskey3: 'yo',
uselesskey4: 'ya',
max_email_nb_sent: null
}
];
var parametersObj = records
.map(item => ({ ...item,
"email_nb": item.max_email_nb_sent ? item.max_email_nb_sent + 1 : 0
}))
console.log(parametersObj);
推荐阅读
- ssl - Apache Nifi - 使用 SSL 和 LDAP 配置安全问题
- android - 如何在android binder中找到实现该方法的文件
- python - 无法启动 Jupyter Notebook
- oracle - OCI DNS 是否支持域名注册?
- javascript - 如何使用 jquery 和 javascript 在页面加载时隐藏某些记录
- kubernetes - 使用单舵图部署多个服务
- c++ - 允许重复键并保留其插入顺序的 QMap 式容器
- python - Django在尝试创建对象时抛出“'NoneType'对象不可调用”错误
- azure - Azure - 数据库迁移服务中永无止境的完整备份上传
- jquery - 通过单击清除输入搜索