使用 Array.find() 尝试动态获取特定对象值并根据对象名称返回它,函数不返回任何内容

乔希

我有一个对象值数组,每个对象值都有自己的对象子数组。

我正在尝试使用 Array.find() 方法专门针对每个数组节点,并根据名称从它的子数组中返回一个值。

我的函数都写出来了,但没有返回任何内容,我不断收到警告,说明:

Expected to return a value at the end of the function(array-callback-return)

而且我不完全确定我错过了什么。

供参考的函数和数据结构以及一个CodeSandbox

const subjectTypes = [
  {
    name: "pokemon",
    details: [
      {
        type: "subtitle",
        value: "This is the subtitle for pokemon"
      }
    ]
  },
  {
    name: "marvel",
    details: [
      {
        type: "subtitle",
        value: "This is the subtitle for marvel"
      }
    ]
  }
];

const setCustomValue = (location) => {
  let value;

  switch (location) {
    case "/pokemon":
      return (value = subjectTypes.find(function (subject, idx) {
        if (subject.name === "pokemon") return subject.details.value;
      }));
    case "/marvel":
      return (value = subjectTypes.find(function (subject, idx) {
        if (subject.name === "marvel") return subject.details.value;
      }));
    default:
      return null;
  }
};

const customValue = setCustomValue("/pokemon");

export default function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Dynamically Populated Content Below:</h2>
      <p>{customValue}</p>
    </div>
  );
}

另外我知道这可能看起来像过度工程,我可以很容易地使用 .map() 或类似的来打印值,但我将其用作我正在尝试解决的更大问题的简化版本解决需要类似 .find() 方法来返回特定结果的方法。

VLAZ
  1. Array#find()期待一个trueorfalse来自回调。或者至少是一个真值或假值。

  2. ESLint 规则array-callback-return报告了一个相关问题。回调只从 返回一些东西if,而不是在不满足条件时。这通常是有效的- noreturn使函数隐式返回undefined由于该值为假,find将忽略此项并继续下一项。然而,ESLint 规则是为了使这些返回明确并防止错误,以防它实际上是一个代码分支不返回任何内容的错误。

  3. 在回调中,返回值是subject.details.value但实际路径是subject.details[0].value因为subject.details是一个数组。因此,您唯一的回报是产生undefined.

  4. 不可能同时定位一个值.find()并修改返回的值你需要返回值第一,然后得到它的一个子部分。

  5. value从不使用时无需声明和分配

为了解决这些问题,这里的代码有点清理:

const setCustomValue = (location) => {
  let value;
  switch (location) {
    case "/pokemon":
      value = subjectTypes.find(function (subject, idx) {
        return subject.name === "pokemon";
      });
      return value.details[0].value;
    case "/marvel":
      value = subjectTypes.find(function (subject, idx) {
        return subject.name === "pokemon";
      });
      return value.details[0].value;
    default:
      return null;
  }
};

为了避免一些重复,您可以提取.find()return之外的逻辑switch

const setCustomValue = (location) => {
  let name;
  switch (location) {
    case "/pokemon":
      name = "pokemon";
      break;
    case "/marvel":
      name = "marvel";
      break;
    default:
      return null;
  }

  const value = subjectTypes.find((subject) => subject.name === name);
  return value.details[0].value;
};

switch可以通过使用简单的查找来消除整体

const paths = {
  "/pokemon": "pokemon",
  "/marvel": "marvel",
}
const setCustomValue = (location) => {
  let name = paths[location];

  if (!name) 
    return null;

  const value = subjectTypes.find((subject) => subject.name === name);
  return value.details[0].value;
};

使用可选链接无效合并运算符甚至更小

const paths = {
  "/pokemon": "pokemon",
  "/marvel": "marvel",
}
const setCustomValue = (location) => 
  subjectTypes.find((subject) => subject.name === paths[location])?.details[0].value ?? null;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果回调函数没有返回任何真实值,`Array.find` 可以使用默认值吗?

在Array.find()中使用异步函数

如何在返回单个对象时递归使用Array.prototype.find()?

解构由array.find返回的对象

使用getRepository()-> find()的Gedmo树不返回Gedmo对象

Array.find(value)返回值“不是函数”

如何使用lodash从Array查找并返回对象?

如何使用Array php返回JSON对象

使用Array.find()基于键在对象数组中查找对象

使用 Array 中的名称值创建对象

使用动态对象名称访问对象

而不是 $.each 想使用 Array.find

从全局环境中的对象获取名称(使用特定模式),然后返回新内容

使用Key获取Array对象的值

使用SQLCMD执行脚本返回无效的对象名称

.find不返回完整对象

是否可以创建不使用Array构造函数或数组文字的Array.isArray()返回true的对象?

替换函数$$ find始终不返回任何内容

使用.Find函数VBA-不返回第一个值

是否可以使用std库的find,begin和end编写in_array helper函数?

Javascript - 使用 find 获取对象 ID

mongoosejs - find() 使用嵌套对象

使用array_unshift后“尝试获取非对象的属性”

Ruby-Array.find,但返回值块

mongoose find() 函数不返回整个对象,跳过空字段

当对象是JSON对象与Array对象时,为什么[For .. in]循环中使用的变量返回不同的值?

JavaScript 对象问题:使用对象名称获取对象的属性值

如果对象名称是动态的,如何使用 Python 获取 Salesforce 对象的元数据?

使用递归,检索嵌套对象结构的对象名称返回未定义