javascript - 如果键匹配,则更新对象的现有属性
问题描述
我正在尝试创建这样的对象:
type: "asset", value: { long: 1.45, short: 1.67, extendedLong: 2.67 }
由此:
[{percent: 1.45, type: long, sector: asset}, {percent: 1.67, type: short, sector: asset}, {percent: 2.67, type: extendedLong, sector: asset}
我尝试了一种维护一开始为空的对象的方法。我正在做这样的事情:
if (!object[asset]) {
object[asset] = { long: 1.45 }
}
else object[asset] = { short: 1.67}
但这行不通。有人可以帮忙吗?
解决方案
您可以映射新对象并将所有对象分配给单个对象。
var array = [{ percent: 1.45, type: 'long', sector: 'asset' }, { percent: 1.67, type: 'short', sector: 'asset' }, { percent: 2.67, type: 'extendedLong', sector: 'asset'}],
result = Object.assign(...array.map(({ percent, type }) => ({ [type]: percent })));
console.log(result);
对于更深的嵌套对象,您需要一种不同的方法,因为对嵌套对象进行赋值时,该对象会删除珍贵保存的嵌套对象。相反,您可以减少数组并保持所需结果的结构。
var array = [{ percent: 1.45, type: 'long', sector: 'asset' }, { percent: 1.67, type: 'short', sector: 'asset' }, { percent: 2.67, type: 'extendedLong', sector: 'asset' }, { percent: 1.45, type: 'long', sector: 'Convertible' }, { percent: 1.67, type: 'short', sector: 'Convertible' }, { percent: 2.67, type: 'extendedLong', sector: 'Convertible' }],
result = array.reduce((o, { percent, type, sector }) => {
o[sector] = o[sector] || {};
o[sector][type] = percent;
return o;
}, {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- java - JdbcTestUtils 和事务上下文测试
- debugging - 调试触发的 modsecurity 规则命中
- python - Python相关问题 - 用户输入日期/N00B/
- .htaccess - 如果uri是root,需要在htaccess中设置env
- php - PHP 注意:遇到格式不正确的数值 - 过时的代码?
- python - Pandas 分析 - KeyError:“请求的级别(var1)与索引名称(无)不匹配”
- laravel - 语法错误或访问冲突:1055 'adminlte3.orders.name' 不在 GROUP BY 中
- typescript - 如何定义仅接受某些用户定义类的实例的 Typescript 类型
- google-bigquery - 如何安排 GBQ 查询并每天将数据导出到 Excel 文件?
- nginx - 修复 nginx 配置以允许 iframe