【问题标题】:Object.keys.map does't return the original keysObject.keys.map 不返回原始键
【发布时间】:2023-03-23 23:39:01
【问题描述】:

我正在从我的数据库中获取一个对象: 示例:

{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
...}

【问题讨论】:

  • 顺便说一句,您的 api 存在重大安全漏洞:响应不应包含密码。
  • 是的,这将是我的下一步,谢谢!

标签: javascript arrays reactjs object


【解决方案1】:

Object.entriesObject.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。测试value == null(使用双等号==)也足以与javascript中的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);

【讨论】:

  • 非常感谢,现在可以使用了!我只是做了一点改动,变成了这样:const a = await getUserData(userId); const cleanUserData = Object.entries(a).reduce( (accumulator, [key, value]) => { return {...accumulator, [key] : (value == null ? '' : value)} }, {}) setUserData(cleanUserData) }我需要更多地挖掘这些高阶函数的逻辑,因为我真的不知道如何熟练地使用它们。
【解决方案2】:

您可能需要使用例如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);

【讨论】:

  • 谢谢!我不知道这种方法存在,看起来它完全符合我的需要!
【解决方案3】:

请检查此解决方案

 Object.keys(x).reduce((acc, key)=> {
    acc[key] = x[key] === null ? '' : x[key];
    return acc;
    }, {})

附言

Object.entries() 方法返回给定对象自己的数组 可枚举的字符串键属性 [key, value] 对。

这就是为什么你会收到一个索引而不是真正的键

【讨论】:

  • false0 的值呢?这将替换所有虚假值,包括 false0。 OP 只想替换 nullundefined
  • 很抱歉再次打扰您,但不应该是x[key] === null ? '' : x[key] 而不是相反吗?您的代码将保留nulls,但将所有其他值替换为''
【解决方案4】:

这里是通过复制对象的可能解决方案:

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));

【讨论】:

    【解决方案5】:

    很简单,您可以使用 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)

    【讨论】:

    • 这将替换所有虚假值,包括 false0。 OP 只想替换 nullundefined
    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2015-01-08
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多