下面是一个类似我想做的事的黑匣子视图示例。
keyMany (arr: any[], cbk: (any) => string[])
given that arr === [e1, e2, e3] (but could be any length);
given cbk(e1) -> ['foo'];
given cbk(e2) -> ['foo', 'bar'];
given cbk(e3) -> ['baz', 'bar'];
然后
output: {
foo: [e1, e2],
bar: [e2, e3],
baz: [e3]
}
为总结正在发生的事情,作为集合的第一个参数按元素方式应用cbk
以确定该元素应属于输出中的哪些键。一个元素可能是多个输出键集的一部分。
请注意:
cbk
应用于e1
的结果仅为foo
,因此e1
仅参与输出密钥集foo
。 cbk
应用于e2
导致foo
和bar
,因此e2
在输出键集foo
和{{1}中}。 bar
类似,相反,仅针对键集e3
和bar
。理想地,如果有对象,则输出集合中的baz
等同于输入集合中的e
。
请注意:第一个输入
我的问题是:Lodash中已经存在这样的东西吗?对于该问题,最喜欢的答案是带有版本号的是或否。
顺便说一句,如果这种行为难以实现或看起来很有价值,那么我目前在Lodash上拥有PR,以添加一个e
API:
https://github.com/lodash/lodash/pull/4149/commits/cfe2918c905481f6f713be0a4e10cd4b60d32c4a
答案 0 :(得分:0)
如果我正确理解了您的问题,那么您想使用自定义回调函数产生的子数组值中的键来构建字典。
对于数据/输入,一种选择是使用Array#reduce()
来实现这一点,如下所述:
// Mock setup data to support code snippet
var e1 = '0', e2 = '1', e3 = '2';
// Mock setup function to support code snippet
var cbk = (arg) => {
switch(arg) {
case e1: return ['a'];
case e2: return ['a','b'];
case e3: return ['b','c'];
}
}
// Your input
var inputs = [e1,e2,e3];
// Process to aquire desired output
var output = inputs.reduce((result, inputValue) => {
// Iterate callback result of each input value
cbk(inputValue).forEach(cbkItem => {
// Aquire array new or existing array that corresponds
// to this callback result's value (ie 'a', 'c', etc)
var callbackResultArray = (result[ cbkItem ] || []);
// Add current input value to callback result array
callbackResultArray.push(inputValue);
// Update result map with callback result array
result[ cbkItem ] = callbackResultArray;
});
return result;
}, {});
console.log(output);