为什么一个工作而另一个不工作?
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,姓名:“约翰·多伊”}
答案 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.entries
和reduce
使用),并且可以与暗示箭头返回。
答案 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