📜  Lodash _.transform() 方法(1)

📅  最后修改于: 2023-12-03 15:32:44.971000             🧑  作者: Mango

Lodash _.transform() 方法

Lodash库提供了很多可靠的方法来对数组、对象以及函数进行操作。其中一个非常有用的方法就是_.transform()方法。

该方法可用于对象或数组,用于按照自定义逻辑迭代元素并返回结果。你可以用它来自定义将元素转换为另一种格式或从它们中过滤元素的方式。

_.transform(collection, [iteratee], [accumulator])

该方法接受三个参数:

  1. collection(Array | Object):必需;要迭代的集合`
  2. [iteratee=_.identity] (Function):可选;每次迭代调用的函数
  3. [accumulator] (*): 可选;累加器初始化值。

下面简要介绍iteratee回调函数:

iteratee回调函数
参数
  1. [accumulator] (*): 最近一次累加器迭代函数的返回值。
  2. value (*): 当前元素的值。
  3. [key] (string|number): 当前元素的下标或键。
  4. [collection] (Array|Object): 对迭代操作的集合。
返回值

对于每个迭代过程,iteratee可以有一个返回值,该值将作为下一个迭代过程的最新累加器值并在最后返回累加器。如果不返回,则将使用前一次返回的结果作为累加器。

下面是一些示例,演示了如何使用iteratee回调函数来自定义转换集合的方式:

_.transform([1, 2, 3, 4], function(result, value, key) {
  if (value % 2 == 0) result.push(value);
}, []);
// => [2, 4]

_.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, value, key) {
  result[key.toUpperCase()] = value;
}, {});
// => { 'A': 1, 'B': 2, 'C': 3 }

第一个示例将一个包含数字的数组转换为一个只包含偶数的新数组,而第二个示例将一个具有任意键值的对象转换为一个只包含键名为大写字母的新对象。

示例

下面是一个更完整的示例,演示了如何使用_.transform()方法将一个可重复扩展的嵌套对象转换为一组唯一值:

// source object
const source = {
  a1: {
    b1: 'value1',
    b2: 'value2',
  },
  a2: {
    b3: 'value3',
    b4: 'value4',
  },
};

// transformed object
const transformed = _.transform(source, function(result, value, key) {
  _.each(value, function(innerValue, innerKey) {
    if (_.has(result, innerValue)) {
      result[innerValue].push(`${key}.${innerKey}`);
    } else {
      _.set(result, innerValue, [`${key}.${innerKey}`]);
    }
  });
}, {});

console.log(transformed);
// output: 
// { 
//   value1: [ 'a1.b1' ], 
//   value2: [ 'a1.b2' ], 
//   value3: [ 'a2.b3' ], 
//   value4: [ 'a2.b4' ] 
// }

在这个示例中,我们有一个可重复扩展的嵌套对象。我们通过_.transform()方法遍历这个对象,并提取出所有的值及其对应的 key。如果值已经存在于“结果”对象中,我们将找到的 key 加入到结果数组中。否则,我们需要将 key 加入到唯一值当中,以便日后的访问。

最终,我们得到了一个 transformed 对象,它包含了所有唯一值以及这些值访问 key 组合的数组。

总结: Lodash的transform方法能够帮助我们快速用自定义方式操作数组和对象,解决很多开发中的问题,更多关于该方法的信息可以在Lodash官方文档中快速获取。