再次练习 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 调用将完全相同,当然,除了有效负载之外。
我的做法是首先通过执行以下步骤来过滤列表:
const hasArray = filter(has(__,originalObj), toCheckArray);
我相信这会检查目标 obj 中是否存在作为 prop 的元素;- 我正在尝试将
complement(anyPass([isNil, isEmpty]))
应用于 obj 的所有值,然后以某种方式过滤数组中相应的键; - 迭代数组?进行 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/