javascript - 将相同的字段项转换为值数组
问题描述
我正在尝试使用如下键映射数组
const data = [{
"_id": "5f0ffb96d67d70c1a3b143e7",
"name": "USER",
"type": "CUSTOM",
"origin": "USER",
"conditions": [{
"_id": "5f0ffb96d67d70c1a3b143e8",
"field": "status",
"value": "Nomita",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143e9",
"field": "current_status",
"value": "ACTIVE",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143ea",
"field": "user_group_uuid",
"value": "d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143eb",
"field": "user_group_uuid",
"value": "20348751-dcaa-4227-a0ff-912b27180aee",
"operator": "equal"
}]
}]
以上是输入。
const filters_data = { ...data[0] }
const filters_mapping = (array, keyField) =>
array.reduce((obj, item) => {
obj[item[keyField]] = item
return obj
}, {})
const filter_items = filters_mapping(filters_data.conditions,'field');
从这段代码中我得到
{ user_status:
{ _id: 5f0ffb96d67d70c1a3b143e8,
field: 'status',
value: 'Nomita',
operator: 'equal' },
current_status:
{ _id: 5f0ffb96d67d70c1a3b143e9,
field: 'current_status',
value: 'ACTIVE',
operator: 'equal' },
user_group_uuid:
{ _id: 5f0ffb96d67d70c1a3b143eb,
field: 'user_group_uuid',
value: 'd12s0a7c-11ac-7abf-bl03-f0b70e26f8f2',
operator: 'equal' } }
但我实际上想要这样的东西,value
当字段相似时映射 in 数组。
{ user_status:
{ _id: 5f0ffb96d67d70c1a3b143e8,
field: 'status',
value: 'Nomita',
operator: 'equal' },
current_status:
{ _id: 5f0ffb96d67d70c1a3b143e9,
field: 'current_status',
value: 'ACTIVE',
operator: 'equal' },
user_group_uuid:
{ _id: 5f0ffb96d67d70c1a3b143eb,
field: 'user_group_uuid',
value: ['d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2','20348751-dcaa-4227-a0ff-912b27180aee'],
operator: 'equal' } }
只有当有多个字段可用时才会发生这种情况,否则,它只会返回普通字符串。
解决方案
这是一种可能的解决方案。
您的代码不处理密钥已经存在的情况。
const data = [{
"_id": "5f0ffb96d67d70c1a3b143e7",
"name": "USER",
"type": "CUSTOM",
"origin": "USER",
"conditions": [{
"_id": "5f0ffb96d67d70c1a3b143e8",
"field": "status",
"value": "Nomita",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143e9",
"field": "current_status",
"value": "ACTIVE",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143ea",
"field": "user_group_uuid",
"value": "d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143eb",
"field": "user_group_uuid",
"value": "20348751-dcaa-4227-a0ff-912b27180aee",
"operator": "equal"
}]
}];
const mutatedData = data[0].conditions.reduce((tmp, {
_id,
field,
value,
operator,
}) => {
// Handle the case where the field already exists
if (tmp[field]) {
tmp[field].value = [
...(tmp[field].value instanceof Array ?
tmp[field].value : [tmp[field].value]),
value,
];
return tmp;
}
// Handle the case where the field doesn't exist yet
tmp[field] = {
_id,
field,
value,
operator,
};
return tmp;
}, {});
console.log(mutatedData);
精简版
const data = [{
"_id": "5f0ffb96d67d70c1a3b143e7",
"name": "USER",
"type": "CUSTOM",
"origin": "USER",
"conditions": [{
"_id": "5f0ffb96d67d70c1a3b143e8",
"field": "status",
"value": "Nomita",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143e9",
"field": "current_status",
"value": "ACTIVE",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143ea",
"field": "user_group_uuid",
"value": "d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2",
"operator": "equal"
}, {
"_id": "5f0ffb96d67d70c1a3b143eb",
"field": "user_group_uuid",
"value": "20348751-dcaa-4227-a0ff-912b27180aee",
"operator": "equal"
}]
}];
const mutatedData = data[0].conditions.reduce((tmp, {
_id,
field,
value,
operator,
}) => (tmp[field] = tmp[field] ? ((tmp[field].value = [
...(tmp[field].value instanceof Array ?
tmp[field].value : [tmp[field].value]),
value,
]) && tmp[field]) : {
_id,
field,
value,
operator,
}) && tmp, {});
console.log(mutatedData);
推荐阅读
- html - 如何让我的搜索栏填充剩余的 100% 水平 div 空间?
- asp.net-mvc - 在 MVC 视图的“TR”标签中合并具有相同 ID 的不同数据
- olap - 在 Snowflake 中构建 OLAP Cube
- r - 从R中给定的X轴值查找Y轴的值
- java - 在java中添加2个异常
- android - 带有 Fragment 和 RelativeLayout(包含 RecyclerView)的嵌套 ScrollView 不滚动
- windows - 在 Windows 资源管理器中为每个用户创建上下文菜单子菜单
- azure-machine-learning-service - Azure 机器学习服务 - 在 Environment 中定义的环境变量无法从 entry_script 中的 init() 方法访问
- android - onNewIntent() 在没有额外内容的情况下不必要地调用
- git - 直接 diff 本地文件在 Git 中提交