【问题标题】:Looping Javascript Array Objects and Separate Objects With Condition循环 Javascript 数组对象并使用条件分隔对象
【发布时间】:2021-05-26 02:36:06
【问题描述】:

假设我有一个名为 data 的变量

const data = [
        {loanname: "Mr X", acnumber:  "020000000000001", outstanding: "54000"},
        {loanname: "Mrs Y", acnumber: "020000000000087", outstanding: "87000"},
        {loanname: "Mr Z", acnumber:  "020000000000103", outstanding: "15000"},
        {totalaccount: "3", outstanding: "156000"},
        {loanname: "David", acnumber: "020000000000091", outstanding: "11000"},
        {loanname: "James", acnumber: "020000000001291", outstanding: "4000"},
        {totalaccount: "2", outstanding: "15000"},

    ]

这是一个数组。我想根据总帐户的次数来提取数据项。例如,在第一个 totalaccount 之前,有三个帐户。我想提取它们。

另外,如果我们可以跳过第一个 totalaccount,则在最后一个 totalaccount 之前有两个帐户。我想提取这两个帐户的信息。

更准确地说,如何将数组转换为以下形式?:

let firstOne = {loanname: "Mr X", acnumber:  "020000000000001", outstanding: "54000"},
    {loanname: "Mrs Y", acnumber: "020000000000087", outstanding: "87000"},
    {loanname: "Mr Z", acnumber:  "020000000000103", outstanding: "15000"},

let secondOne ={loanname: "David", acnumber: "020000000000091", outstanding: "11000"},
    {loanname: "James", acnumber: "020000000001291", outstanding: "4000"}, 

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    您可以使用reduce 轻松实现此结果。

    首先,检查是否存在totalaccount 属性。如果yes 则使用Array.prototypepush 方法在acc 中创建一个新数组如果totalaccount 属性不存在,则只需将对象推入acc 的最后一个数组中。您需要使用current跟踪最后一个数组元素索引

    const data = [
      { loanname: "Mr X", acnumber: "020000000000001", outstanding: "54000" },
      { loanname: "Mrs Y", acnumber: "020000000000087", outstanding: "87000" },
      { loanname: "Mr Z", acnumber: "020000000000103", outstanding: "15000" },
      { totalaccount: "3", outstanding: "156000" },
      { loanname: "David", acnumber: "020000000000091", outstanding: "11000" },
      { loanname: "James", acnumber: "020000000001291", outstanding: "4000" },
      { totalaccount: "2", outstanding: "15000" },
    ];
    
    let current = 0;
    const result = data.reduce((acc, curr) => {
        const { totalaccount } = curr;
        if (totalaccount) {
          acc.push([]);
          ++current;
        } else {
          acc[current].push(curr);
        }
        return acc;
      },
      [[]]
    );
    
    const [first, second] = result;
    console.log(first);
    console.log(second);
    console.log(result);

    您也可以在不跟踪current as 的情况下获得相同的结果

    const data = [
      { loanname: "Mr X", acnumber: "020000000000001", outstanding: "54000" },
      { loanname: "Mrs Y", acnumber: "020000000000087", outstanding: "87000" },
      { loanname: "Mr Z", acnumber: "020000000000103", outstanding: "15000" },
      { totalaccount: "3", outstanding: "156000" },
      { loanname: "David", acnumber: "020000000000091", outstanding: "11000" },
      { loanname: "James", acnumber: "020000000001291", outstanding: "4000" },
      { totalaccount: "2", outstanding: "15000" },
    ];
    
    const result = data.reduce(
      (acc, curr) => {
        const { totalaccount } = curr;
        if (totalaccount) {
          acc.push([]);
        } else {
          acc[acc.length - 1].push(curr);
        }
        return acc;
      },
      [[]]
    );
    
    console.log(result);

    如果你想累积成一个对象并想动态创建属性

    const data = [
      { loanname: "Mr X", acnumber: "020000000000001", outstanding: "54000" },
      { loanname: "Mrs Y", acnumber: "020000000000087", outstanding: "87000" },
      { loanname: "Mr Z", acnumber: "020000000000103", outstanding: "15000" },
      { totalaccount: "3", outstanding: "156000" },
      { loanname: "David", acnumber: "020000000000091", outstanding: "11000" },
      { loanname: "James", acnumber: "020000000001291", outstanding: "4000" },
      { totalaccount: "2", outstanding: "15000" },
    ];
    
    const result = data.reduce(
      (acc, curr) => {
        const { totalaccount } = curr;
        if (totalaccount) {
          acc.push([]);
        } else {
          acc[acc.length - 1].push(curr);
        }
        return acc;
      },
      [[]]
    );
    
    const resultObj = {};
    result.forEach((d, i) => {
      if (d.length) {
        resultObj[`collection${i + 1}`] = [...d];
      }
    });
    console.log(resultObj);

    【讨论】:

    • 返回所有账号。它不会根据“总帐户”拆分数字。在我的问题中,我问是否可以将数组转换为名为“firstOne”和“secondOne”的变量。因为有两次“总帐户”,所以我希望将数组分成两部分。如果有 3 次“总帐户”,我希望将数组分成三部分,依此类推。我该怎么做?
    • 它会帮你检查结果数组...
    • @Rashel——你不能有条件地在循环中创建任意变量,如 firstOnesecondOne 等。你可以创建一个数组或具有所需名称的属性并将结果分配给它们的对象,请参阅Dynamically Creating Variables for Loops
    • 因为result会返回一个数组数组,所以你可以通过数组索引获取数据。
    • @decpk 你的代码对我有用。我需要将结果分成多个部分,因为它们是不同类型的贷款,我需要将它们分开以供将来计算。
    【解决方案2】:

    试试这个逻辑(未完全测试,只是一个想法)

    const myArray = [];
    for (let i = 0; i < data.length; i++) {
      if (!data[i].totalaccount) continue;
        myArray.push([]);
        for (let x = i - data[i].totalaccount; x <= i - 1; x++) {
          myArray[myArray.length-1].push(data[x]);
        }
    }
    console.log(myArray);
    

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2021-11-29
      相关资源
      最近更新 更多