我有以下数组 struct :

const values = [{
    "region": "US", "content": "content 1", "value": "value1"
}, {
    "region": "US", "content": "content 2", "value": "value2"
}, {
    "region": "US", "content": "content 3", "value": "value3"
}, {
    "region": "LA", "content": "content 4", "value": "value4"
}, {
    "region": "LA", "content": "content 5", "value": "value5"
}, {
    "region": "LA", "content": "content 6", "value": "value6"
}, {
    "region": "LA", "content": "content 7", "value": "value7"
}]

我正在try 将其转换为以下内容-请注意,在输出数组内的结果对象中没有region键:

const output = [{
    "US": [
        {"content": "content 1", "value": "value1"},
        {"content": "content 2", "value": "value2"},
        {"content": "content 3", "value": "value3"}
    ],
    "LA": [
        {"content": "content 4", "value": "value4"},
        {"content": "content 5", "value": "value5"},
        {"content": "content 6", "value": "value6"},
        {"content": "content 7", "value": "value7"}
    ]
}]

到目前为止,这是我try 过的:

let outputValues = [];

values.forEach(currentElement => {
    outputValues[currentElement.region].push(currentElement);
})

console.log(outputValues);

上面的解决方案给出了以下错误:

未捕获的TypeError:无法读取未定义的属性(正在读取‘Push’)

不知道为什么.

我也try 过:

# 1st option
outputValues[currentElement.region] = currentElement;

# 2nd option
outputValues[currentElement.region] = [];
outputValues[currentElement.region].push(currentElement);

但这只添加了主values数组中的最后一个元素.我错过了什么吗?

推荐答案

如果不想保留原始对象,可以将不需要的键作为分组值,并在分组时删除该属性.

const
    values = [{ region: "US", content: "content 1", value: "value1" }, { region: "US", content: "content 2", value: "value2" }, { region: "US", content: "content 3", value: "value3" }, { region: "LA", content: "content 4", value: "value4" }, { region: "LA", content: "content 5", value: "value5" }, { region: "LA", content: "content 6", value: "value6" }, { region: "LA", content: "content 7", value: "value7" }],
    result = Object.groupBy(values, o => {
        const group = o.region;
        delete o.region;
        return group;
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

一种不含groupBy且数据不会发生变化的解决方案:

const
    values = [{ region: "US", content: "content 1", value: "value1" }, { region: "US", content: "content 2", value: "value2" }, { region: "US", content: "content 3", value: "value3" }, { region: "LA", content: "content 4", value: "value4" }, { region: "LA", content: "content 5", value: "value5" }, { region: "LA", content: "content 6", value: "value6" }, { region: "LA", content: "content 7", value: "value7" }],
    result = values.reduce((r, { region, ...o}) => {
        (r[region] ??= []).push(o);
        return r;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Javascript相关问答推荐

如何在NightWatch.js测试中允许浏览器权限?

zoom svg以适应圆

传递一个大对象以在Express布局中呈现

我开始使用/url?q=使用Cheerio

使用复选框在d3.js多折线图中添加或删除线条

当点击注册页面上的注册按钮时,邮箱重复

MathJax可以导入本地HTML文档使用的JS文件吗?

setcallback是什么时候放到macrotask队列上的?

如何调用名称在字符串中的实例方法?

加载背景图像时同步旋转不显示的问题

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

第二次更新文本输入字段后,Reaction崩溃

如何在JAVASCRIPT中临时删除eventListener?

如何确保预订系统跨不同时区的日期时间处理一致?

无法避免UV:flat的插值:非法使用保留字"

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

无法使用npm install安装react-dom、react和next

验证Java脚本函数中的两个变量

如何在Java脚本中添加一个可以在另一个面板中垂直调整大小的面板?

带有JS模块模式的Rails的Importmap错误:";Net::ERR_ABORTED 404(未找到)&Quot;