【问题标题】:loop between a nested object array and another array在嵌套对象数组和另一个数组之间循环
【发布时间】:2018-10-04 17:56:40
【问题描述】:

我有两个数组,一个是普通数组,另一个是对象数组。 我在这里只想告诉我如何在他们两个之间建立一个循环以获得“Jhon”是good和(midterm+finalterm)的总和 在一个 : 第一个 no 是 no of school,第二个是 class>> 我将使用 .split("|") 将它们放在一个数组中 在 b: 对象数组中

我不想要整个代码,只想要循环和 if 条件

该函数会将 a 中的 1|1 与 school_no 和 class_no 进行比较以匹配

但我希望 if 条件根据评估为学生的姓名着色,例如红色表示坏,蓝色表示好。

这里是数组

a=["1|1|Jhon","1|2|Akram","1|3|Mali"]
    //first no for school no
    //second no for class no.
    b= [{
        "result": [
          {
            "midterm": 25,
            "evaluation": "good",
            "finalterm": 24
          }
        ],
        "school  _no": 1,
        "class_no": 1
      },
      {
        "result": [
          {
            "midterm": 55,
            "evaluation": "verygood",
            "finalterm": 60
          }
        ],
        "school_no": 1,
        "class_no": 2
      },
    {
        "result": [
          {
            "midterm": 11,
            "evaluation": "bad",
            "finalterm": 12
          }
        ],
        "school_no": 1,
        "class_no": 3
      }
    
    ];
    console.log(a);
    console.log(b);

这不是家庭作业,但它是我正在做的更大事情的一个小例子。

【问题讨论】:

  • a=[1|1|"Jhon",1|2|"Akram",1|3|"Mali"] 应该是a=["1|1|Jhon","1|2|Akram","1|3|Mali"],对吧?
  • @user3297291 我会假设,否则当前的“a”将在控制台中输出 [1,3,3]。
  • 是的,我犯了错误。对不起
  • 数组a 中的学生是否总是按索引与b 中的结果匹配?或者您是否需要根据这两个属性明确检查每个学生的每个结果?
  • @user3297291 是的,匹配

标签: javascript arrays json


【解决方案1】:

只需迭代a(学生)的数据,找到b(结果)中的学校号和班级号:

a=["1|1|Jhon","1|2|Akram","1|3|Mali"]
//first no for school no
//second no for class no.
b= [{
    "result": [
      {
        "midterm": 25,
        "evaluation": "good",
        "finalterm": 24
      }
    ],
    "school_no": 1,
    "class_no": 1
  },
  {
    "result": [
      {
        "midterm": 55,
        "evaluation": "verygood",
        "finalterm": 60
      }
    ],
    "school_no": 1,
    "class_no": 2
  },
{
    "result": [
      {
        "midterm": 11,
        "evaluation": "bad",
        "finalterm": 12
      }
    ],
    "school_no": 1,
    "class_no": 3
  }

];
var result=[]
a.forEach(function(element) {
  var data= element.split("|");
 
  var found = b.find(function(element) {
  return element.school_no == data[0] && element.class_no== data[1];
});
 result.push(data[2]+" is "+found.result[0].evaluation+" and sum of (midterm+finalterm) is :"+(found.result[0].midterm+found.result[0].finalterm));
 document.getElementById(data[2]).className = found.result[0].evaluation;

});
console.log(result);
.good {
    color: blue;
}

.bad {
    color: red;
}

.verygood {
    color: green;
}
<div id="Jhon">Jhon</div>
<div id="Akram">Akram</div>
<div id="Mali">Mali</div>

【讨论】:

  • 首先谢谢你。但是有没有不使用 div 的着色方式。
【解决方案2】:

如果它们的顺序相同,并且result[0]始终是匹配学生的那个,则可以进行普通循环并按索引访问:

const students = [ "1|1|Jhon",  "1|2|Akram","1|3|Mali" ];
const results = [{result:[{midterm:25,evaluation:"good",finalterm:24}],school_no:1,class_no:1},{result:[{midterm:55,evaluation:"verygood",finalterm:60}],school_no:1,class_no:2},{result:[{midterm:11,evaluation:"bad",finalterm:12}],school_no:1,class_no:3}];


for (let i = 0; i < students.length; i += 1) {
  const student = students[i];
  const result = results[i];
  
  console.log({
    name: parseStudentName(student),
    result: getResultColor(result),
  });
}

function parseStudentName(studentString) {
  return studentString.split("|")[2]
};

function getResultColor(result) {
  switch(result.result[0].evaluation) {
    case "verygood":
    case "good":
      return "blue";
    case "bad":
      return "red";
  }
}

【讨论】:

    【解决方案3】:

    第二个数组出现错误 => school _no

    我只是遍历a 数组。我在b 数组中搜索每个学生项目,返回node.result 数组。

    a=["1|1|Jhon","1|2|Akram","1|3|Mali"]
    //first no for school no
    //second no for class no.
    b= [{
        "result": [
          {
            "midterm": 25,
            "evaluation": "good",
            "finalterm": 24
          }
        ],
        "school_no": 1,
        "class_no": 1
      },
      {
        "result": [
          {
            "midterm": 55,
            "evaluation": "verygood",
            "finalterm": 60
          }
        ],
        "school_no": 1,
        "class_no": 2
      },
    {
        "result": [
          {
            "midterm": 11,
            "evaluation": "bad",
            "finalterm": 12
          }
        ],
        "school_no": 1,
        "class_no": 3
      }
    ];
    
    for(var i = 0; i < a.length; i++) {
        var parts = a[i].split('|');
        try {
            var node = getStudentNode(parseInt(parts[0]), parseInt(parts[1]));
            console.log(node);
        }
        catch(ex){
            console.log(ex);
        }
    }
    
    function getStudentNode(sc, cl) {
        for(var i = 0; i < b.length; i++) {
            var node = b[i];
            if(node.school_no !== sc || node.class_no !== cl) continue;
            return node.result;
        }
    }

    【讨论】:

      【解决方案4】:

      我的理解是你想生成一个新数组,其中包含对象列表,其中包含字符串和基于评估的颜色。

      var a=["1|1|Jhon","1|2|Akram","1|3|Mali"]
      //first no for school no
      //second no for class no.
      var b= [{
      "result": [
        {
          "midterm": 25,
          "evaluation": "good",
          "finalterm": 24
        }
      ],
      "school_no": 1,
      "class_no": 1
        },
        {
      "result": [
        {
          "midterm": 55,
          "evaluation": "verygood",
          "finalterm": 60
        }
      ],
      "school_no": 1,
      "class_no": 2
        },
      {
      "result": [
        {
          "midterm": 11,
          "evaluation": "bad",
          "finalterm": 12
        }
      ],
      "school_no": 1,
      "class_no": 3
        }
      ];
      
      
      var resultArrNew = a.reduce(function(ac, val) {
          var valArra = val.split("|");
      var matched = b.filter(function(obj) {
          return obj.school_no == valArra[0] && obj.class_no == valArra[1];
      });
      var text = valArra[2] + " is " + matched[0].result[0].evaluation + " and sum is " + (matched[0].result[0].midterm+matched[0].result[0].finalterm);
      var color = matched[0].result[0].evaluation === 'good' ? 'blue' : 'red';
      
      ac.push({text: text, color: color});
      return ac;
      }, []);
      console.log(resultArrNew);

      【讨论】:

        【解决方案5】:

        以下是我将如何使用更实用的方法来做到这一点

        const a =["1|1|Jhon", "1|2|Akram", "1|3|Mali"]
        
        const b = [{
            "result": [
              {
                "midterm": 25,
                "evaluation": "good",
                "finalterm": 24
              }
            ],
            "school  _no": 1,
            "class_no": 1
          },
          {
            "result": [
              {
                "midterm": 55,
                "evaluation": "verygood",
                "finalterm": 60
              }
            ],
            "school_no": 1,
            "class_no": 2
          },
        {
            "result": [
              {
                "midterm": 11,
                "evaluation": "bad",
                "finalterm": 12
              }
            ],
            "school_no": 1,
            "class_no": 3
          }
        ];
        
        // import some functional helpers
        const { map, propPathOr, compose } = crocks
        
        const getStudent = record => {
          const [school_no, class_no, student_name] = record.split('|')
          return { school_no, class_no, student_name }
        }
        
        const getStudents = map(getStudent)
        
        const getEvaluation = propPathOr('', ['result', 0, 'evaluation'])
        
        const getEvaluations = map(getEvaluation)
        
        // assuming your lists are sorted
        const zip = (xs, ys) => xs.map((x, i) => [x, ys[i]])
        
        const combineStudentAndEvaluation = ([student, evaluation]) =>
          ({ ...student, evaluation })
        
        const stringify = ({student_name, evaluation}) =>
          `${student_name}: ${evaluation}`
        
        const studentEvaluationToString = compose(stringify, combineStudentAndEvaluation)
        
        const merged = zip(getStudents(a), getEvaluations(b))
          .map(studentEvaluationToString)
            
        console.log(merged)
        &lt;script src="https://unpkg.com/crocks/dist/crocks.min.js"&gt;&lt;/script&gt;

        【讨论】:

          猜你喜欢
          • 2018-10-12
          • 1970-01-01
          • 1970-01-01
          • 2018-10-14
          • 2021-12-09
          • 2021-12-09
          • 2021-11-17
          • 1970-01-01
          相关资源
          最近更新 更多