ES6等价于lodash _.mapValues函数

13

有哪些不同的方法可以将 lodash 的 _.mapValues 转换为 ES6。

代码:

var fruits= {
  'apple':    { 'name': 'apple',    'number': 5},
  'orange': { 'name': 'orange', 'number': 10 }
};

_.mapValues(fruits, 'number');

输出:

{ 'apple': 5, 'orange': 10 }
5个回答

28

reduce函数将对象的entries减少到另一个对象,并仅从值中提取number

var fruits= {
  'apple':    { 'name': 'apple',    'number': 5},
  'orange': { 'name': 'orange', 'number': 10 }
};

console.log(Object.entries(fruits)
  .reduce((a, [key, { number }]) => {
    a[key] = number;
    return a;
  }, {}
));

在更新的环境中,你可以使用 Object.fromEntries 来将映射到一个键值对数组的数组,使它更加优美。

var fruits= {
  'apple':    { 'name': 'apple',    'number': 5},
  'orange': { 'name': 'orange', 'number': 10 }
};

console.log(Object.fromEntries(
  Object.entries(fruits).map(([key, { number }]) => [key, number])
));


5
您可以使用for..in循环将旧对象的键和值添加到新对象中。

var fruits = {
  'apple': {
    'name': 'apple',
    'number': 5
  },
  'orange': {
    'name': 'orange',
    'number': 10
  }
};

let newObj = {};

for (let keys in fruits) {
  newObj[keys] = fruits[keys].number;
}

console.log(newObj)


0
使用 Array.reduceObject.entriesObject.assign

var fruits= {'apple':    { 'name': 'apple',    'number': 5},'orange': { 'name': 'orange', 'number': 10 }};
let result = Object.entries(fruits).reduce((a,[k,{number}]) => Object.assign(a, {[k]:number}), {});
console.log(result);


0

ES6

你也可以使用Object.keys()reduce()来获得所需的结果。

演示

var fruits= {
  'apple':    { 'name': 'apple',    'number': 5},
  'orange': { 'name': 'orange', 'number': 10 }
};


let result = Object.keys(fruits).reduce((r,v)=>Object.assign(r,{[v]:fruits[v].number}),{});

console.log(result);
.as-console-wrapper {max-height: 100% !important;top: 0;}


0
这是对其他答案的小跟进,以便reducer不会改变累加器对象。
const newObject = Object.entries(fruits)
  .reduce((acc, [fruitKey, { number }]) => ({
    ...acc,
    [fruitKey]: number,
  }), {}
));

使用展开运算符...acc语法是reduce方法的更函数式编程风格的一种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接