Javascript减少速记不返回对象

时间:2018-07-04 19:35:04

标签: javascript ecmascript-6

为什么一个工作而另一个不工作?

const b = {
  age: 20,
  name: "John Doe"
}

const sortedB = Object.entries(b).sort().reduce((acc, [key, val]) => acc[key] = val,{});

输出:John Doe

顶部没有显示自动返回return acc的块括号。 底部说的是大括号,这意味着您必须手动返回acc

  const sortedB = Object.entries(b).sort().reduce((acc, [key, val]) => {
    acc[key] = val;
    return acc;
  },{});

输出:{年龄:20,姓名:“约翰·多伊”}

3 个答案:

答案 0 :(得分:3)

  

顶部遗漏了表示自动返回acc的块括号

不,那不是什么意思。 JavaScript如何/为什么要知道返回acc

如果您的箭头函数仅将表达式作为主体,则将返回该表达式的结果。分配的结果就是分配的值。示例:

var func = () => 1;
console.log(func()); // 1

func = x => x;
console.log(func(42)) // 42

func = (x, y) => y = 42;
console.log(func(1,2)); // 42

func = x => (x, 42);
console.log(func(21)); // 42

func = x => (42, x);
console.log(func(21)); // 21

如果要返回acc的值,则必须确保表达式的计算结果为该值,例如与逗号运算符:

 (acc, [key, val]) => (acc[key] = val, acc)
 //                    ^^^^^^^^^^^^^^^^^^^
 //  the comma operator returns the result of the right expression

答案 1 :(得分:1)

正如在另一个答案中已经解释的那样,acc[key] = val表达式无法自动返回acc ,因为它的计算结果为val,而不是acc

在ES6的reduce函数中可以方便使用的配方是Object.assign,因为它返回了它扩展的对象:

Object.entries(b).sort().reduce((acc, [key, val]) => Object.assign(acc, { [key]: val }) ,{});

它比acc[key] = val; return acc昂贵,但可以在非关键性的地方使用(不建议在性能关键性的地方Object.entriesreduce使用),并且可以与暗示箭头返回。

答案 2 :(得分:0)

您甚至可以使用带有 function createIR(irData, irRec, count, poId) { //irData its one item object try { var sublistId = 'item' for (var i = 0; i < count; i++) { irRec.setSublistValue(sublistId, 'quantity', i, '') } var itemId = getItemId(irData.item) var quantity = irData.quantity for (var i = 0; i < count && quantity; i++) { var item = irRec.getSublistValue(sublistId, 'item', i) log.debug('line', i) log.debug('itemId', itemId); if (item == itemId) { var qtyRem = irRec.getSublistValue(sublistId, 'quantityremaining', i) var diff = qtyRem - quantity if (diff >= 0) { irRec.setSublistValue(sublistId, 'quantity', i, quantity) break; } else { quantity -= qtyRem irRec.setSublistValue(sublistId, 'quantity', i, qtyRem) } } } } catch (e) { log.error('createIR (for poId: ' + poId + ')', e) } } 的简短版本:

ES6