首页 > 解决方案 > 在两个单独的函数中或在单个函数中创建和填充对象?

问题描述

我多次遇到这个问题。问题是我有一个由键和值组成的元素数组,我需要将数组简化为一个对象,其中包含键和每个键的值的总和(例如["foo", 1], ["bar", 1], ["foo", 1]变成{foo: 2, bar: 1})。最好先将所有键设置为 0 的对象初始化,然后使用该对象还是使用空对象并检查属性是否每次都存在?

function juiceMapFromFormat(format) {
    return format
        .map(juiceString=>{
            const [juiceName, quantityString] = juiceString.split(/\s*=>\s*/gim);
            const quantity = +quantityString;

            return [juiceName, quantity];
        })
        .reduce((juiceMap, juiceArr)=>{
            const [juiceName, quantity] = juiceArr;
            const previousQuantity = juiceMap.get(juiceName) || 0;

            if (previousQuantity < 1000) {
                juiceMap.delete(juiceName);
            }
            juiceMap.set(juiceName, previousQuantity + quantity);

            return juiceMap;
        }, new Map());
}

这是我目前的功能。我的示例使用地图,但这是因为问题。我的问题是针对地图和对象的。我有两个条件 - 属性是否存在并且数量小于 1000。第二个条件是因为我正在解决的问题。我的问题是,最好是保留它还是将果汁数组的数组保存在一个常量中并使用它来用每个果汁名称初始化一个 Map 并将该映射作为初始值提供给 reduce 方法,这样就可以删除需要|| 在 juiceMap.get(juiceName) 之后为 0。哪个会更好?

编辑:该函数采用正确映射的字符串数组。我需要返回一张地图。我的问题是我是否应该保留这两个条件或删除一个检查属性是否存在的条件,并通过预先将每个属性初始化为 0 来确保每个属性都存在。

编辑 2:如果我事先初始化所有属性,我将减少圈复杂度,因为条件将被删除。至少我是这么理解的。

标签: javascriptcyclomatic-complexity

解决方案


我会用一个循环广告直接减少数据。

function juiceMapFromFormat(format) {
    return format.reduce((juiceMap, juiceString) => {
        const [juiceName, quantityString] = juiceString.split(/\s*=>\s*/gim);
        return juiceMap.set(juiceName, (juiceMap.get(juiceName) || 0) + +quantityString);
    }, new Map());
}

推荐阅读