如何实现基于两个数组创建结果数组的逻辑

How to implement logic to create result array based on two arrays?

本文关键字:数组 创建 结果 于两个 何实现 实现      更新时间:2023-09-26

我有三个JavaScript数组:

  var arr1 = [
    {id:32, "isNormal":true},
    {id:4,  "isNormal":false}},
    {id:2,  "isNormal":false},
    {id:35, "isNormal":true},
    {id:44, "isNormal":false}]
  var arr2 = [
    {id:32, "isNormal":false},
    {id:4,  "isNormal":false}},
    {id:44, "isNormal":true},
    {id:35, "isNormal":true},
    {id:2,  "isNormal":true}]

var arrResult = [
   {externalId:32, startDate:currentDateTime, endDate:"null", "isNormal":false},
   {externalId:4,  startDate:"null", endDate:"null", "isNormal":false}},
   {externalId:44, startDate:"null", endDate:"currentDateTime", "isNormal":true},
   {externalId:35, startDate:"null", endDate:"null", "isNormal":true},
   {externalId:2, startDate:"null", endDate:"currentDateTime", "isNormal":false}]

数组具有相同的 ID。

我需要检查 arr1 中对象的 isNormal 属性与 arr2 中对象的适当属性(具有相同的 id),

  • 如果 arr1.isNormal = true 且 arr2.isNormal = false 写入 arrResult.startDate 当前日期和时间,

  • 如果 arr1.isNormal = false 和 arr2.isNormal = true 写入 arrResult.endDate 当前日期和时间,

  • 否则什么都不做。

这里对应的数组结果对应于 arr1 和 arr2。实现这一点的优雅方式是什么?

为了检查您的isNormals是否不同,我建议使用 XOR 运算符 ^ 。此外,首先对数组进行排序也会很好。

这里有几个例子,你如何做到这一点。

//I've fixed your data, because it is incorrect
var arr1 = [
    {id:32, startDate:"null", endDate:"null", "isNormal":true},
    {id:4,  startDate:"null", endDate:"null", "isNormal":false},
    {id:2,  startDate:"null", endDate:"null", "isNormal":false},
    {id:35, startDate:"null", endDate:"null", "isNormal":true},
    {id:44, startDate:"null", endDate:"null", "isNormal":false}]
  var arr2 = [
    {id:32, startDate:"null", endDate:"null", "isNormal":false},
    {id:4,  startDate:"null", endDate:"null", "isNormal":false},
    {id:44, startDate:"null", endDate:"null", "isNormal":true},
    {id:35, startDate:"null", endDate:"null", "isNormal":true},
    {id:2, startDate:"null", endDate:"null", "isNormal":true}];
var sortFunction = function(a, b) {
    return a.id - b.id;
}
arr1.sort(sortFunction);
arr2.sort(sortFunction);
//This way:
var result = arr2.map(function(v, i) {
    var i1 = arr1[i].isNormal, 
        i2 = v.isNormal,
        obj = {id:arr1[i].id, isNormal:v.isNormal};
    
    obj.startDate = i1 ^ i2 && i1 ? 'currentDateTime' : 'null';
    obj.endDate = i1 ^ i2 && i2 ? 'currentDateTime' : 'null';
    return obj;
});
document.write('First: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
//Or this way:
result = [];
for(var i = 0; i < arr1.length; i++) {
   var i1 = arr1[i].isNormal,
       i2 = arr2[i].isNormal,
       obj = {id:arr1[i].id, startDate:"null", endDate:"null", isNormal:arr2[i].isNormal};
   if(i1 ^ i2 && i1) {
       obj.startDate = 'currentDateTime';
   } else if(i1 ^ i2 && i2) {
       obj.endDate = 'currentDateTime';
   }
   result.push(obj);
}
document.write('Second: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
//Or this way:
var result = arr2.reduce(function(r, c, i) {
    var i1 = arr1[i].isNormal, 
        i2 = c.isNormal,
        obj = {id:arr1[i].id, startDate:"null", endDate:"null", isNormal:c.isNormal};
    if(i1 ^ i2 && i1) obj.startDate = 'currentDateTime';
    if(i1 ^ i2 && i2) obj.endDate = 'currentDateTime';
    
    return r.push(obj), r;
}, []);
document.write('Third: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));

你去...有时最好保持代码简单...

var arrResult = [];
//loop through the two arrays
for (var i=0; i < arr1.length; i++) {
    for (var j=0; j < arr2.length; j++) {
        if (arr1[i].id == arr2[j].id) {
            // if arr1.isNormal = true and arr2.isNormal = false write to arr2.startDate current date and time,
            if (arr1[i].isNormal && arr2[j].isNormal == false) {
                arrResult.push({externalId: arr1[i].id, startDate:new Date(), endDate:null, "isNormal":false})
            }
            //if arr1.isNormal = false and arr2.isNormal = true write to arr2.endDate current date and time,
            if (arr1[i].isNormal == false && arr2[j].isNormal) {
                arrResult.push({externalId: arr1[i].id, startDate:null, endDate:new Date(), "isNormal":true}) 
            }
        }
    }
}

请耐心等待,我对jQuery不是那么好,但我做了这个JSFiddle。 它可能会对你有所帮助。所以基本上比较两个 id,如果它们相同并且是正常的:真做 A,如果它们是相同的和 isnormal:false 做 B。

var res_arr = [];
for (var i=0; i < arr1.length; i++) {
for (var j=0; j < arr2.length; j++) {
    if ( arr1[i].id == arr2[j].id && arr1[i].isNormal == arr2[j].isNormal == false) {
        res_arr.push({id: arr1[i].id, startDate:'currentDateTime', endDate:"null", "isNormal":false})
    }
    else if ( arr1[i].id == arr2[j].id && arr1[i].isNormal == arr2[j].isNormal == true) {
      res_arr.push({id: arr1[i].id, startDate:"null", endDate:'currentDateTime', "isNormal":true}) 
    }
}
}