细分函数映射并减少-JS

时间:2017-06-18 01:45:03

标签: javascript arrays object

我正在处理一个函数:

function transformEmployeeData(array) {
  return array.map(function(data) {
    return data.reduce(function(a, b) {
      a[b[0]] = b[1];
      return a;
    }, {})
  });
}
transformEmployeeData(array);

此函数将数组转换为如下对象:

[
    {firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk'},
    {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}
]

所以如果你有一个数组:

[
    [
        ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
    ],
    [
        ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
    ]
]

它会将其转换为。

我想关注这一部分:

return array.map(function(data) {
    return data.reduce(function(a, b) {
      a[b[0]] = b[1];
      return a;
    }, {})
  });

我研究了map函数,它迭代数组并用它做一些事情,而reduce函数将数组压缩成一个值。现在我不清楚这两个函数如何协同工作返回转换后的数组对象。是否有人可以帮助我理解这些部分的外行术语?或者如果没有最简单的方法来实现同样的目标吗?

SOrry新手。

1 个答案:

答案 0 :(得分:2)

从这个意义上说,映射数组意味着返回一个新数组,每个值都是根据某些映射函数转换的。

const numbers = [1, 2, 3];
const squares = numbers.map(num => num ** 2);
console.log(squares);

如您所说,减少数组意味着将其元素组合成单个值。

const numbers = [1, 2, 3];
const sum = numbers.reduce((total, num) => total + num, 0);
console.log(sum);

在这种情况下,您有3个级别的嵌套数组,该过程可分为3个功能单元。了解正在发生的事情的最简单方法是从最内部点开始,然后向外转到顶层数组的映射。

在最内层,[property, value]形式的2个元素的数组被添加到对象中,使得第一个元素是属性名称,第二个元素是值。

const arr = ['name', 'bob'];

// property is item[0], value is item[1]
const propertyName = arr[0];
const propertyValue = arr[1];

const obj = {};
obj[propertyName] = propertyValue;

console.log(obj); // { name: 'bob' }

在中间层,我们有一个数组,其中每个元素都是上面提到的2元素数组。通过将每个2元素数组转换为对象的属性和值,该数组数组被缩减为对象。

const arr = [
  ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
];

const reduced = arr.reduce((obj, item) => {
  obj[item[0]] = item[1]; // add property and value to new object
  return obj;             // return the object so next array item can be converted
}, {});

console.log(reduced);

最后,顶级映射只是将上面提到的2元素数组数组(3个数组级别)的数组转换为一个对象数组,这些对象获得了前面提到的属性和值。