javascript - 将对象与新值连接起来并将其转换为数组

标签 javascript arrays typescript object ecmascript-6

我有这样的情况:我正在推送对象新的键值对,例如:

let a1 = {key1: 'val1'};
let a2 = {key2: 'val2'};
const result = {...a1, ...a2};

结果我得到了一个有效的新对象:{key1: 'val1', key2: 'val2'}

但是还有第三种情况:

let a1 = {key1: 'val1'};
let a2 = {key2: 'val2'};
let b1 = {key1: 'val1b'};
const result = {...a1, ...a2, ...b1};

结果我应该得到:

{key1: ['val1', 'var1b'], key2: 'val2'}`.

so -> 如果已经存在这样的键 -> 将此键值转换为数组并推送它们。

我尝试过:

对于...我要推送的所有对象:

const keysToPush = Object.keys(b1);
const keysInitial = Object.keys(a1); // foreach too
if (keysInitial.includes(keysToPush)) // push as array

但是看起来很丑

也许应该有更优雅的解决方案?

最佳答案

检查 key 是否存在。如果是,检查它是否是一个数组,并相应地处理每种情况:

let a1 = {
  key1: 'val1'
};
let a2 = {
  key2: 'val2'
};
let b1 = {
  key1: 'val1b'
};

const merge = (...o) => {
  let res = o.reduce((acc, curr) => {
    Object.entries(curr).forEach(([k, v]) => {
      acc[k] = (acc[k] && Array.isArray(acc[k]) ? [...acc[k], v] : (acc[k] ? [acc[k], v] : v));
    });
    return acc;
  });
  return res;
};

let result = merge(a1, a2, b1);
console.log(result);
.as-console-wrapper {
  max-height: 100% !important;
  top: auto;
}

关于javascript - 将对象与新值连接起来并将其转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55899159/

相关文章:

javascript - Node.JS、Sequelize 和 Moment.JS 的日期格式

C++ 数组,平均值(初级)

java - 使用 Comparable 对整数数组进行排序

node.js - 无法启动 nodemon 环境

javascript - 哪个更适合标识通过菜单打开的窗口,outerWindowID 或 currentInnerWindowID?

javascript - 从传单 map 中删除图层

javascript - Vue-Test-Utils 的 "mount"和 "shallowMount"之间的区别?

C - 在跟踪索引的同时对 float 组进行排序

javascript - Angular2 错误 - 我的登录组件没有提供程序错误

Javascript 优化、V8 引擎和 Typescript