我从数据库中获取一个对象: 例如:
{availability: null
bio: null
category: ""
createdAt: "2020-10-13T13:47:29.495Z"
email: "oznerol@prova.com"
firstName: "Lorenzo"
id: 37
image: null
job: null
lastName: "Del Rosario"
location: ""
password: "$2b$10$J6m71nc8gBXTvEENMwBjt.azNitCsna3LsxaDIUg.B0ztiTm5xFea"
phone: ""
skills: null
updatedAt: "2020-10-13T13:47:29.495Z"
website: ""}
我试图通过该对象进行映射,以将所有null
的值更改为''
。
这是我的代码:
const [userData, setUserData] = useState()
useEffect( ()=>{
const fetchData = async () => {
const a = await getUserData(userId);//this retuns the object
const cleanUserData = Object.entries(a).map(([key, value]) =>
value === null || undefined ? value = '' : value
)
setUserData(cleanUserData);
};
fetchData();
},[])
但是以这种方式我更改了我的值,但是我松开了我的键,结果是一个像这样的对象:
{0:37
1:"oznerol@prova.com"
2:"$2b$10$J6m71nc8gBXTvEENMwBjt.azNitCsna3LsxaDIUg.B0ztiTm5xFea"
3:"Lorenzo"
4:"Del Rosario"
5:""
6:""
7:""
8:""
9:""
10:""
11:""
12
...}
答案 0 :(得分:7)
Object.entries
和Object.keys
都返回一个数组,因此当您使用map
时,结果将是一个数组。使用reduce
来创建新对象,如下所示:
const cleanUserData = Object.entries(a).reduce((acc, [key, value]) => {
acc[key] = value == null ? '' : value;
return acc;
}, {});
注意:您的原始测试value === null || undefined
不正确,因为这不是您针对两个可能的值进行测试的方式,应该为value === null || value === undefined
。同样,使用JavaScript中的value == null
测试==
(使用双等号undefined == null
)就足够了。
演示:
const a = {availability: null, bio: null, category: "", createdAt: "2020-10-13T13:47:29.495Z", email: "oznerol@prova.com", firstName: "Lorenzo", id: 37, image: null, job: null, lastName: "Del Rosario", location: "", password: "$2b$10$J6m71nc8gBXTvEENMwBjt.azNitCsna3LsxaDIUg.B0ztiTm5xFea", phone: "", skills: null, updatedAt: "2020-10-13T13:47:29.495Z", website: ""};
const cleanUserData = Object.entries(a).reduce((acc, [key, value]) => {
acc[key] = value == null ? '' : value;
return acc;
}, {});
console.log(cleanUserData);
答案 1 :(得分:3)
您可能需要使用例如Object.fromEntries
在映射后重新创建主对象。
const o = {availability: null, bio: null, category: '', createdAt: "2020-10-13T13:47:29.495Z", email: "oznerol@prova.com", firstName: "Lorenzo", id: 37, image: null, job: null, lastName: "Del Rosario", location: "", password: "$2b$10$J6m71nc8gBXTvEENMwBjt.azNitCsna3LsxaDIUg.B0ztiTm5xFea", phone: '', skills: null, updatedAt: "2020-10-13T13:47:29.495Z", website: "",};
const res = Object.fromEntries(
Object.entries(o).map(([key, val]) => [key, val ?? '']),
);
console.log(res);
// then set the state -> setUserData(res);
答案 2 :(得分:2)
请检查此解决方案
Object.keys(x).reduce((acc, key)=> {
acc[key] = x[key] === null ? '' : x[key];
return acc;
}, {})
P.S。
Object.entries()方法返回给定对象自己的数组 可枚举的字符串键属性[key,value]对。
这就是为什么您收到索引而不是真实密钥的原因
答案 3 :(得分:1)
简单,您可以使用map reduce函数获取结果。
const obj = {
"availability": null,
"bio": null,
"category": "",
"createdAt": "2020-10-13T13:47:29.495Z",
"email": "oznerol@prova.com",
"firstName": "Lorenzo",
"id": 37,
"image": null,
"job": null,
"lastName": "Del Rosario",
"location": "",
"password": "$2b$10$J6m71nc8gBXTvEENMwBjt.azNitCsna3LsxaDIUg.B0ztiTm5xFea",
"phone": "",
"skills": null,
"updatedAt": "2020-10-13T13:47:29.495Z",
"website": ""
}
const result = Object.keys(obj).reduce((acc, curr) => {
acc[curr] = (obj[curr] === null || obj[curr] === undefined) ? '' : obj[curr]
return acc;
}, {})
console.log(result)
答案 4 :(得分:1)
这是通过复制对象实现的一种可能的解决方案:
const data ={
availability: null,
bio: null,
category: "",
createdAt: "2020-10-13T13:47:29.495Z",
email: "oznerol@prova.com",
firstName: "Lorenzo",
id: 37,
image: null,
job: null,
lastName: "Del Rosario",
location: "",
password: "$2b$10$J6m71nc8gBXTvEENMwBjt.azNitCsna3LsxaDIUg.B0ztiTm5xFea",
phone: "",
skills: null,
updatedAt: "2020-10-13T13:47:29.495Z",
website: ""
};
let cleanUserData = (data) => {
const cleanData = {};
Object.keys(data).forEach((key) =>
cleanData[key] = data[key] === null ? '' : data[key]
)
return cleanData;
};
console.log(cleanUserData(data));