Lodash函数,用于将集合分为键子集合

时间:2019-01-13 19:17:20

标签: javascript arrays object lodash

下面是一个类似我想做的事的黑匣子视图示例。

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以确定该元素应属于输出中的哪些键。一个元素可能是多个输出键集的一部分。

请注意:

  1. 由于将cbk应用于e1的结果仅为foo,因此e1仅参与输出密钥集foo
  2. 由于将cbk应用于e2导致foobar,因此e2在输出键集foo和{{1}中}。
  3. bar类似,相反,仅针对键集e3bar

理想地,如果有对象,则输出集合中的baz等同于输入集合中的e

请注意:第一个输入

我的问题是:Lodash中已经存在这样的东西吗?对于该问题,最喜欢的答案是带有版本号的是或否。

顺便说一句,如果这种行为难以实现或看起来很有价值,那么我目前在Lodash上拥有PR,以添加一个e API: https://github.com/lodash/lodash/pull/4149/commits/cfe2918c905481f6f713be0a4e10cd4b60d32c4a

1 个答案:

答案 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);