如何将forEach转为map - javascript

时间:2017-06-14 06:57:10

标签: javascript functional-programming ecmascript-6

 NSError *error = nil;
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
        [session setActive: YES error:nil];

        AVAudioSessionPortDescription *routePort = session.currentRoute.outputs.firstObject;

        [session  overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];

当我们获取一些数据并通过我们定义的模式给它赋值时,这是非常常见的情况。

如果我不想看到其他的判断,是否有任何想法将此代码转换为函数编程代码?

2 个答案:

答案 0 :(得分:2)

您可以为每次迭代返回一个新对象并映射结果。

对于属性value,我建议使用一个对象,它可以很容易地扩展为更多的键/值对。

var testArray = [{ name: 'A', value: 'aa' }, { name: 'B', value: 'bb' }],
    result = testArray.map(field =>
        Object.assign(
            {},
            field,
            { value: { A: 'xxx', B: 'yyyyy' }[field.name] || field.value }
        ));

console.log(result);

答案 1 :(得分:-2)

编辑:我正在根据OP的评论完全改变答案

因此,您有一个对象列表,每个对象可能不同,并且您希望根据特定字段的值处理每个项目。

为简化起见,我假设您的对象中唯一常见的是“类型”字段,并且您有任意数量的可能值。

首先,确定您的值,并编写一个函数来处理每种类型。

基本的if-else方法类似于:

if (object.type == 'user') {
    process_user(object);
} else if (object.type == 'notification') {
    process_notification(object);
} else if (object.type == 'comment') {
    process_comment(object)
}

所以你想用一个神奇的功能结构替换if-else链?

您可以创建从类型到处理函数的映射:

var processors = {
    'user': process_user
    'notification': process_notification
    'comment': process_comment
}

然后你只需查找正确的函数来根据它在这个地图中的类型来处理对象,然后你调用它:

var fn = processors[object.type]
if(fn) {
    fn(object)
}