【问题标题】:How to compare two object array using javascript/angularjs?如何使用 javascript/angularjs 比较两个对象数组?
【发布时间】:2018-02-24 03:50:56
【问题描述】:

我有 2 个对象,我想将其合并为一个对象数组,但我需要先使用 JavaScript 或 AngularJS 进行比较。

A = [
     {date: "2013-07-31", start_time:"2013-07-31 17:30:00+10", finish_time:"2013-07-31 20:30:00+10"},
     {date: "2013-08-03", start_time:"2013-08-03 17:00:00+10", finish_time:"2013-08-03 20:00:00+10"},
     {date: "2013-09-03", start_time:"2013-09-03 17:00:00+10", finish_time:"2013-09-03 20:00:00+10"}
    ]

B = [
     {date: "2013-07-31", start_time:"2013-07-31 17:37:49+10", finish_time:"2013-07-31 20:32:04+10"},
     {date: "2013-08-03", start_time:"2013-08-03 16:57:34+10", finish_time:"2013-08-03 20:00:57+10"}
    ]

Expected output
C = [
     {date: "2013-07-31", start_time:"late", finish_time:"on time"},
     {date: "2013-08-03", start_time:"on time", finish_time:"on time"},
    ]

如果两个对象数组具有相同的日期,我将首先比较,然后我将比较相同日期的开始,然后如果 B 上的 start_time 值超过 A start_time,那么它将更改为“迟到”的字符串”。同样对于finish_time,如果B 上的值低于A,则字符串将“为时过早”。

【问题讨论】:

  • 那么,您的两个数组的长度相同,对吧?然后循环其中一个数组的长度,并将日期、时间字符串解析为日期或日期时间对象,以便您轻松进行比较。得到比较结果后,将想要的值插入到新数组中。
  • 我忘了说如果长度不完全一样。
  • 这是作业吗?
  • @JosephSerido 这是一部作品。问题解决了。谢谢!

标签: javascript angularjs object javascript-objects arrayobject


【解决方案1】:

对我来说,这实际上只是一个 JavaScript 问题,而不是真正的 AngularJS 问题。

我认为您正在寻找这样的东西:

const A = [
     {date: "2013-07-31", start_time:"2013-07-31 17:30:00+10", finish_time:"2013-07-31 20:30:00+10"},
     {date: "2013-08-03", start_time:"2013-08-03 17:00:00+10", finish_time:"2013-08-03 20:00:00+10"},
     {date: "2013-08-03", start_time:"2013-08-03 17:00:00+10", finish_time:"2013-08-03 20:00:00+10"}
    ];

const B = [
     {date: "2013-07-31", start_time:"2013-07-31 17:37:49+10", finish_time:"2013-07-31 20:32:04+10"},
     {date: "2013-08-03", start_time:"2013-08-03 16:57:34+10", finish_time:"2013-08-03 20:00:57+10"},
     {date: "2013-08-03", start_time:"2013-08-03 16:57:34+10", finish_time:"2013-08-03 19:00:57+10"}
    ];


let C = [];
const maxLength = Math.min(A.length, B.length);

for (let i = 0; i < maxLength; i += 1) {
  const startTimeResult = B[i].start_time > A[i].start_time ? 'late' : 'on time';
  const finishTimeResult = B[i].finish_time > A[i].finish_time ? 'on time' : 'too early';
  C[i] = { date: A[i].date, start_time: startTimeResult, finish_time: finishTimeResult };
  console.log(C[i]);
}

https://codepen.io/joseph4tw/pen/mXGeoO?editors=1012

【讨论】:

  • 这很好,但是如果 A 上的日期在 B 上没有怎么办?你能帮我一点忙吗?它现在接近我的预期输出。
  • @TepTep 我怎么知道如何比较 A 和 B?我可以假设A[0] 应该与B[0] 进行比较,而A[1] 应与B[1] 进行比较吗? A.lengthB.length 会有所不同吗?如果有,应该怎么做?
  • @TepTep 答案已更新以解决数组长度的差异
【解决方案2】:

嗨,这就是我想出的,我不知道该说什么。 我认为代码会自己说话:p

var A = [
     {date: "2013-07-31", start_time:"2013-07-31 17:30:00+10", finish_time:"2013-07-31 20:30:00+10"},
     {date: "2013-08-03", start_time:"2013-08-03 17:00:00+10", finish_time:"2013-08-03 20:00:00+10"}
    ];

var B = [
     {date: "2013-07-31", start_time:"2013-07-31 17:37:49+10", finish_time:"2013-07-31 20:32:04+10"},
     {date: "2013-08-03", start_time:"2013-08-03 16:57:34+10", finish_time:"2013-08-03 20:00:57+10"}
     ];

function getResult()
{
    var results = [];
    for(var i = 0; i < A.length; i++)
    {
        var objA = A[i];

        for(var j = 0; j < B.length; j++)
        {
            var objB = B[j];

            if(objB.date === objA.date)
            {
                var o = {};
                o.date = objA.date;

                //if start_time of A is less than start_time of B
                if(Date.parse(objA.start_time) < Date.parse(objB.start_time))
                    o.start_time = "late";
                else
                    o.start_time = "on time";

                //if end_time of A is less than end_time of B
                if(Date.parse(objA.finish_time) < Date.parse(objB.finish_time))
                    o.finish_time = "too early";
                else
                    o.finish_time = "on time";

                results.push(o);
            }
        }
    }

    if(results.length !== 0)
        return results;

    return null;
}

附: 它只会输出 A 的日期等于 B 的日期的对象

【讨论】:

    【解决方案3】:

    据我了解,基本上您想根据A 中存在的值搜索数组B 中的值,并计算开始时间是早、晚还是准时。

    https://stackoverflow.com/users/1148564/joseph-serido 的解决方案可以完美运行,但需要 O(n^2) 时间。在 Javascript 中,您可以通过键名访问对象。如果您将 A 和 B 作为对象,您可以利用这种行为并让您的代码只运行一个循环。

    var A_Times = {}; //Make an Object
    //Use the date as Key
    A_Obj["2013-07-31"] = {start_time:"2013-07-31 17:30:00+10", finish_time:"2013-07-31 20:30:00+10"};
    A_Obj["2013-08-03"] ={ start_time:"2013-08-03 17:00:00+10", finish_time:"2013-08-03 20:00:00+10"};
    
    var B_Times = {};
    B_Times["2013-07-31"] = {start_time:"2013-07-31 17:37:49+10", finish_time:"2013-07-31 20:32:04+10"};
    B_Times["2013-08-03"] ={start_time:"2013-08-03 16:57:34+10", finish_time:"2013-08-03 20:00:57+10"};
    
    var A_Days = Object.keys(A_Times); //Get all the days in A
    
    for(var i=0; i<A_Times_Days.length; i++){
        var day = A_Times_Days[i];
        console.log(day); //Log the Key here
        var A_Data = A_Times[day];
        var B_Data = B_Times[day];
        console.log(A_Data);
        console.log(B_Data);
        //Compute punctuality here based on A_Data and B_Data
    }
    

    但是,如果您的用例只涉及几天的数据,那么这种增加的复杂性可能不值得。由您决定取舍。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-12-18
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多