首页 > 解决方案 > 如何在js ES6中的破坏结构中传递多个参数

问题描述

我有一个元素数组,我试图做几列。

我已经阅读了有关从中解构元素的 reduce 方法。但问题是我无法在其中传递多个参数。

另外,它不识别其中传递的元素。

这是我的代码:

const prob = h.lead_plans.reduce((currentTotal, currentDau) => {
                                            console.log(currentDau.probability);
                                            return  ({'probability'} = {probability: ((currentTotal || 0) + currentDau.probability)})
                                        }, {probability: 0});

预期代码:

const prob = h.lead_plans.reduce((currentTotal, currentDau) => {
                                            return  ({probability,plan2} = {
                                                probability: ((currentTotal || 0) + currentDau.probability),
                                                plan2: ((currentTotal || 0) + currentDau.plan2),
                                            })
                                        }, {probability: 0, plan2: 0});

作为最终结果,我将获得基于解构结构的内部列的总和。

添加哈希:

这是我的哈希:

{
    "success": true,
    "leads": [
    {
        "id": 9,
        "branch": "Accounts",
        "classification": "Warm",
        "theme": "Lean",
        "branch_id": 3,
        "classification_id": 1,
        "project_id": 30,
        "theme_id": 3,
        "projectname": "project test",
        "comment": "commenters",
        "customername": "alex",
        "lead1id": 2,
        "lead1percent": "2.0",
        "lead2id": 2,
        "lead2percent": "2.0",
        "lead3id": 2,
        "lead3percent": "2.0",
        "lead_plans": [
            {
                "id": 5,
                "lead_id": 9,
                "addcosts": "2.0",
                "fee": "2.0",
                "plan2": "2.0",
                "plan3": "2.0",
                "probability": "2.0",
                "year": "2020-02-12"
            }
        ],
        "offers": [
            {
                "id": 5,
                "lead_id": 9,
                "addcosts": "2.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "2.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            }
        ]
    },
    {
        "id": 10,
        "branch": "Accounts",
        "classification": "Warm",
        "theme": "Lean",
        "branch_id": 3,
        "classification_id": 1,
        "project_id": 28,
        "theme_id": 3,
        "projectname": "project test",
        "comment": "commenters",
        "customername": "alex",
        "lead1id": 2,
        "lead1percent": "2.0",
        "lead2id": 2,
        "lead2percent": "2.0",
        "lead3id": 2,
        "lead3percent": "2.0",
        "lead_plans": [
            {
                "id": 6,
                "lead_id": 10,
                "addcosts": "2.0",
                "fee": "2.0",
                "plan2": "2.0",
                "plan3": "2.0",
                "probability": "2.0",
                "year": "2020-02-12"
            }
        ],
        "offers": [
            {
                "id": 6,
                "lead_id": 10,
                "addcosts": "2.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "2.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            }
        ]
    },
    {
        "id": 11,
        "branch": "Accounts",
        "classification": "Warm",
        "theme": "Lean",
        "branch_id": 3,
        "classification_id": 1,
        "project_id": 30,
        "theme_id": 3,
        "projectname": "project test",
        "comment": "commenters",
        "customername": "alex",
        "lead1id": 2,
        "lead1percent": "2.0",
        "lead2id": 2,
        "lead2percent": "2.0",
        "lead3id": 2,
        "lead3percent": "2.0",
        "lead_plans": [
            {
                "id": 7,
                "lead_id": 11,
                "addcosts": "2.0",
                "fee": "2.0",
                "plan2": "2.0",
                "plan3": "2.0",
                "probability": "2.0",
                "year": "2020-02-12"
            },
            {
                "id": 8,
                "lead_id": 11,
                "addcosts": "6.0",
                "fee": "5.0",
                "plan2": "4.0",
                "plan3": "3.0",
                "probability": "6.0",
                "year": "2020-02-12"
            },
            {
                "id": 9,
                "lead_id": 11,
                "addcosts": "5.0",
                "fee": "2.0",
                "plan2": "5.0",
                "plan3": "1.0",
                "probability": "3.0",
                "year": "2020-02-12"
            }
        ],
        "offers": [
            {
                "id": 7,
                "lead_id": 11,
                "addcosts": "2.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "2.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            },
            {
                "id": 8,
                "lead_id": 11,
                "addcosts": "7.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "9.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            },
            {
                "id": 9,
                "lead_id": 11,
                "addcosts": "8.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "7.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyzas"
            }
        ]
    },
    {
        "id": 11,
        "branch": "Accounts",
        "classification": "Warm",
        "theme": "Lean",
        "branch_id": 3,
        "classification_id": 1,
        "project_id": 30,
        "theme_id": 3,
        "projectname": "project test",
        "comment": "commenters",
        "customername": "alex",
        "lead1id": 2,
        "lead1percent": "2.0",
        "lead2id": 2,
        "lead2percent": "2.0",
        "lead3id": 2,
        "lead3percent": "2.0",
        "lead_plans": [
            {
                "id": 7,
                "lead_id": 11,
                "addcosts": "2.0",
                "fee": "2.0",
                "plan2": "2.0",
                "plan3": "2.0",
                "probability": "2.0",
                "year": "2020-02-12"
            },
            {
                "id": 8,
                "lead_id": 11,
                "addcosts": "6.0",
                "fee": "5.0",
                "plan2": "4.0",
                "plan3": "3.0",
                "probability": "6.0",
                "year": "2020-02-12"
            },
            {
                "id": 9,
                "lead_id": 11,
                "addcosts": "5.0",
                "fee": "2.0",
                "plan2": "5.0",
                "plan3": "1.0",
                "probability": "3.0",
                "year": "2020-02-12"
            }
        ],
        "offers": [
            {
                "id": 7,
                "lead_id": 11,
                "addcosts": "2.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "2.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            },
            {
                "id": 8,
                "lead_id": 11,
                "addcosts": "7.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "9.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            },
            {
                "id": 9,
                "lead_id": 11,
                "addcosts": "8.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "7.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyzas"
            }
        ]
    },
    {
        "id": 11,
        "branch": "Accounts",
        "classification": "Warm",
        "theme": "Lean",
        "branch_id": 3,
        "classification_id": 1,
        "project_id": 30,
        "theme_id": 3,
        "projectname": "project test",
        "comment": "commenters",
        "customername": "alex",
        "lead1id": 2,
        "lead1percent": "2.0",
        "lead2id": 2,
        "lead2percent": "2.0",
        "lead3id": 2,
        "lead3percent": "2.0",
        "lead_plans": [
            {
                "id": 7,
                "lead_id": 11,
                "addcosts": "2.0",
                "fee": "2.0",
                "plan2": "2.0",
                "plan3": "2.0",
                "probability": "2.0",
                "year": "2020-02-12"
            },
            {
                "id": 8,
                "lead_id": 11,
                "addcosts": "6.0",
                "fee": "5.0",
                "plan2": "4.0",
                "plan3": "3.0",
                "probability": "6.0",
                "year": "2020-02-12"
            },
            {
                "id": 9,
                "lead_id": 11,
                "addcosts": "5.0",
                "fee": "2.0",
                "plan2": "5.0",
                "plan3": "1.0",
                "probability": "3.0",
                "year": "2020-02-12"
            }
        ],
        "offers": [
            {
                "id": 7,
                "lead_id": 11,
                "addcosts": "2.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "2.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            },
            {
                "id": 8,
                "lead_id": 11,
                "addcosts": "7.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "9.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyz"
            },
            {
                "id": 9,
                "lead_id": 11,
                "addcosts": "8.0",
                "addcostsinfo": "some info",
                "days": "2020-02-12",
                "decision": "good",
                "decisiondate": "2020-02-12",
                "fee": "7.0",
                "mail": "mail goes here",
                "offerdate": "2020-02-12",
                "paper": "xyzas"
            }
        ]
    }
],
    "message": "Projects fetched successfully"
}

目前,它对我有用,但我被迫为一份工作编写 3 个代码。

工作代码:

const probability = h.lead_plans.reduce((currentTotal, currentDau) => parseFloat((currentTotal || 0)) + parseFloat(currentDau.probability), 0)
const plan2 = h.lead_plans.reduce((currentTotal, currentDau) => parseFloat((currentTotal || 0)) + parseFloat(currentDau.plan2), 0)
const plan3 = h.lead_plans.reduce((currentTotal, currentDau) => parseFloat((currentTotal || 0)) + parseFloat(currentDau.plan3), 0)

标签: javascriptreactjs

解决方案


以下是代码的工作方式。currentTotal第一次运行的值是 reduce 函数的第二个参数,而Array#reduce(function,initialValue)不是{probability: 0, plan2: 0}一个数字。

所以,你不需要做任何对象解构,你只需要使用累加器对你想要的对象的各个键求和,然后返回这些新值。然后您的最终结果将与您用于初始值的类型相同。

这会将概率和 plan2 值转换为数字,以便能够正确地求和。

const h = {
  lead_plans: [{
    probability: '2.2',
    plan2: '5.2'
  }, {
    probability: '7.8',
    plan2: '3.1'
  }, {
    probability: '1.8',
    plan2: '2.3'
  }]
}
const result = h.lead_plans.reduce(
  (accumulator, currentDau) => {
    return {
      probability: accumulator.probability + parseFloat((currentDau.probability || 0)),
      plan2: accumulator.plan2 + parseFloat((currentDau.plan2 || 0)),
    };
  }, {
    probability: 0,
    plan2: 0
  }
);
console.log(result);

下面是一个示例,说明如何制作一个更可重用的 reducer 来汇总对象中的所有条目:

请注意,这是将所有键转换为数字,因此如果存在不是数字的值,它们将是 NaN。

const h = {
  lead_plans: [{
    probability: '2.5',
    plan2: 5
  }, {
    probability: 7,
    plan2: 3
  }, {
    probability: 1,
    plan2: 2
  }]
}
const reducerSumAll = (accumulator, object) => {
  // Ensure there are no accidental mutations
  const current = { ...accumulator };
  for (const key of Object.keys(object)) {
    // Make sure we are only accumulating the number types.
    current[key] = parseFloat(current[key]||0) + parseFloat(object[key]||0);
  }
  return current;
};
const result = h.lead_plans.reduce(reducerSumAll)
console.log(result)


推荐阅读