javascript - 过滤 object[array[@]] 为 nil 或空的数组

标签 javascript functional-programming ramda.js

再次练习 lambda 。

所以情况是我有一个对象:

const originalObj = {
  foo: "bar",
  std: "min",
  baz: "",
  key1: undefined,
  key2: "exit",
  key3: "val3",
  key4: "",
};

我有一个我事先知道的数组:

const toCheckArray = ["baz", "key1", "key2", "key3", "key4", "key5"];

对于数组中的每个元素,我需要检查该元素(作为键)是否存在于 obj 中,以及相应的值是否为 nil/empty。如果这样的键存在,并且该值非零/空,那么我会像这样进行 HTTP 调用来更新该值:

const findKey2AndUpdateObj = async (originalObj) => {
  const originalKey2 = originalObj.key2;
  const key2 = await remoteHttpCall(originalKey2);
  return { ...originalObj, key2: key2 };
};

对于数组中的所有元素,远程 HTTP 调用将完全相同,当然,除了有效负载之外。

我的做法是首先通过执行以下步骤来过滤列表:

  1. const hasArray = filter(has(__,originalObj), toCheckArray); 我相信这会检查目标 obj 中是否存在作为 prop 的元素;
  2. 我正在尝试将 complement(anyPass([isNil, isEmpty])) 应用于 obj 的所有值,然后以某种方式过滤数组中相应的键;
  3. 迭代数组?进行 API 调用,然后更新 obj。

我想我所想的并不是最好的方法。很想听听您的想法! 另外,记住 API 调用也会很棒!


或者也许我应该翻转步骤 1 和步骤 2?从 obj 中过滤掉所有 nil/empty,然后进行 has 检查。


我最终这样做了:filter(has(__,reject(anyPass([isEmpty, isNil]))(obj)),__)(arr)。但肯定有更好的方法。

干杯!

最佳答案

使用管道,可以使其功能更强大,因为您可以将对象传递到管道中并输出键,例如

pipe(reject(either(isNil, isEmpty)),keys,intersection(arr))(obj)

然后您可以将其通过管道传输到 api 调用中(使用 pipeWith)

关于javascript - 过滤 object[array[@]] 为 nil 或空的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68462883/

相关文章:

.net - 你会如何在 F# 中解决这个问题? (高频传感器数据)

haskell - 求解函数方程的最新方法是什么?

java - 实现像这样的可重试调用的 Scala 方法是什么?

javascript - 从数组 Ramda 中按 id 删除对象

javascript - 在 JavaScript 中,如何使用 for 循环迭代器编号来使对象属性键唯一?

javascript - CasperJS 注入(inject)的客户端 JavaScript 未完全加载?

ramda.js - 在 R.pipe 中连续两次调用 R.reduce 之间累加器未重置

javascript - Ramda 返回响应作为请求正文

javascript - 通过一个输入字段隐藏其他元素

javascript - 如何在 IONIC 3 中将多个输入字段作为 JSON 对象发布到服务器