繁体   English   中英

帮助程序 function 从 object 检索值失败,object 中存在多个项目

[英]Helper function to retrieve a value from an object fails with more than one item in the object

当用户的 UID 作为参数传递时,我有一个助手 function 从 redux 存储中检索用户名或 email

From the store

console.log(typeof users) //object
console.log(users)

[
    0: {
        displayName: "User One"
        email: "userone@example.com"
        id: "c9E5RfPVVxMNPz3MsORs76cG46G3"
    },
    1: {
        displayName: "User Two"
        email: "usertwo@example.com"
        id: "mbuPoIcEMOhEvSB23IRqj5AIbZn2"
    }
]
// getUserDetails.js

import { useSelector } from 'react-redux';

export function getUserDetails(searchKey) {
  const users = useSelector((state) => state.firestore.ordered.users);
  console.log(users)
  console.log(typeof users)
  return (
    users &&
    searchKey &&
    users.filter(function (obj) {
      return Object.keys(obj).some(function (key) {
        return obj[key].includes(searchKey);
      });
    })
  );
}

它被我的@devexpress/dx-react-grid CRUD 表使用,获取字段createdBy: fdsj75g43hfihsdhi并返回一个名称或 email,如下所示:

  const UserNameFormatter = ({ value }) => {
    return getUserDetails(value)[0].displayName;
  };

function 仅适用于一个用户,但只要我将另一个用户添加到 Firestore,function 就会引发错误:

TypeError: obj[key].includes is not a function
(anonymous function)
src/utils/getUserDetails.js:10
   7 |   searchKey &&
   8 |   users.filter(function (obj) {
   9 |     return Object.keys(obj).some(function (key) {
> 10 |       return obj[key].includes(searchKey);
     | ^  11 |     });
  12 |   })
  13 | );

我很感激任何建议,谢谢。

您似乎希望每个键都是一个字符串,但情况并非总是如此。

我建议在使用这样的包含方法之前进行检查:

import { useSelector } from 'react-redux';

export function getUserDetails(searchKey) {
  const users = useSelector((state) => state.firestore.ordered.users);
  console.log(users)
  console.log(typeof users)
  return (
    users &&
    searchKey &&
    users.filter(function (obj) {
      return Object.keys(obj).some(function (key) {
        return typeof obj[key] === "string" && obj[key].includes(searchKey);
      });
    })
  );
}

你可以试试这个

  const UserNameFormatter = ({ value }) => {
    return getUserDetails(value[0].displayName);
  };

例子:

 var temp1 = [ { displayName: "User One", email: "userone@example.com", id: "c9E5RfPVVxMNPz3MsORs76cG46G3", }, { displayName: "User Two", email: "usertwo@example.com", id: "mbuPoIcEMOhEvSB23IRqj5AIbZn2" } ] function getUserDetails(searchKey) { return ( temp1.filter(function (obj) { return Object.keys(obj).some(function (key) { return obj[key].includes(searchKey); }); }) ); } console.log(getUserDetails(temp1[1].id))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM