从不同的数组中删除对象/数组差异

Removing object/array difference from different arrays

本文关键字:数组 对象 删除      更新时间:2023-09-26

我有两个JavaScript对象:

object_1 = [
    {'value': '9:00', 'text':'9:00 am', 'eventtime':'09:00:00' },
    {'value': '9:30', 'text':'9:30 am', 'eventtime':'09:30:00' },
    {'value': '10:00', 'text':'10:00 am', 'eventtime':'10:00:00' },
    {'value': '10:30', 'text':'10:30 am', 'eventtime':'10:30:00' },
    {'value': '11:00', 'text':'11:00 am', 'eventtime':'11:00:00' },
    {'value': '11:30', 'text':'11:30 am', 'eventtime':'11:30:00' },
];
object_2 = [
    {'eventtime': '10:30:00'},
    {'eventtime': '11:00:00'}
];

我想删除object_1中具有相同eventtime值的对象并将其存储在新的数组/对象中。请帮我这样做,我找不到解决方案。

这将是新的数组/对象:

object_new = [
    {'value': '9:00', 'text':'9:00 am', 'eventtime':'09:00:00' },
    {'value': '9:30', 'text':'9:30 am', 'eventtime':'09:30:00' },
    {'value': '10:00', 'text':'10:00 am', 'eventtime':'10:00:00' },
    {'value': '11:30', 'text':'11:30 am', 'eventtime':'11:30:00' },
];

这里有一种方法:

// create a plain array with just the eventtime values
var values = object_2.map(function(item) { return item['eventtime']; });
// use .filter() to get an array with just the values we need
var result = object_1.filter(function(item) {
    return !(values.indexOf(item['eventtime']) !== -1);
});

您可以使用

// Declare variables
var object_1 = [
    {'value': '9:00', 'text':'9:00 am', 'eventtime':'09:00:00' },
    {'value': '9:30', 'text':'9:30 am', 'eventtime':'09:30:00' },
    {'value': '10:00', 'text':'10:00 am', 'eventtime':'10:00:00' },
    {'value': '10:30', 'text':'10:30 am', 'eventtime':'10:30:00' },
    {'value': '11:00', 'text':'11:00 am', 'eventtime':'11:00:00' },
    {'value': '11:30', 'text':'11:30 am', 'eventtime':'11:30:00' }
],
object_2 = [
    {'eventtime': '10:30:00'},
    {'eventtime': '11:00:00'}
],
object_new = object_1.slice(),
temp = [];
// Obtain temp=['10:30:00','11:00:00'] from object_2
for (var i=object_2.length-1; i>=0; --i) {
    temp[i] = object_2[i].eventtime;
}
// Remove the elements you don't want
for (var i=object_new.length-1; i>=0; --i) {
    if ( temp.indexOf( object_new[i].eventtime ) !== -1) {
        object_new.splice(i, 1);
    }
}

演示:http://jsfiddle.net/FfSjL/

请注意,如果首先将[{'eventtime': '10:30:00'}, {'eventtime': '11:00:00'}]转换为['10:30:00','11:00:00'],则可以使用本机indexOf,这比javascript循环快得多。

试试这个:

for (var i in object_2) {
    for (var j in object_1) {
        if (object_1[j].eventtime === object_2[i].eventtime) {
            delete object_1[j];
            break;
        }
    }
}

上面的解决方案保留了数组键,但如果你想重置它们,你可以做另一个for循环

var object_new = [];
for (var i in object_1) {
    object_new[object_new.length] = object_1[i];
}
for (var i = object_1.length - 1; i >= 0; i--)
{
    for (var j in object_2)
    {
        if (object_1[i].eventtime === object_2[j].eventtime)
        {
           object_1.splice(i, 1);
           break;
        }
    }
}

JSfiddle link : http://jsfiddle.net/androdify/5ukBF/

注意:它将修改object_1数组。

我认为

,简单的解决方案是(经过测试):

var object_new = [];
for (var idx1 in object_1) {
    var found = false;
    for (var idx2 in object_2) {
        if (object_1[idx1].eventtime === object_2[idx2].eventtime) {
            found = true;
            break;
        }
    }
    if(!found){
        object_new.push(object_1[idx1]);
    }
}

似乎工作正常

 object_1 = [
        {'value': '9:00', 'text':'9:00 am', 'eventtime':'09:00:00' },
        {'value': '9:30', 'text':'9:30 am', 'eventtime':'09:30:00' },
        {'value': '10:00', 'text':'10:00 am', 'eventtime':'10:00:00' },
        {'value': '10:30', 'text':'10:30 am', 'eventtime':'10:30:00' },
        {'value': '11:00', 'text':'11:00 am', 'eventtime':'11:00:00' },
        {'value': '11:30', 'text':'11:30 am', 'eventtime':'11:30:00' },
    ];
object_2 = [
    {'eventtime': '10:30:00'},
    {'eventtime': '11:00:00'}
];
temp = object_2.map(function(o){return o["eventtime"]; })
var object_new = jQuery.grep(object_1, function( n, i ) {
  return ( temp.indexOf(n.eventtime) === -1);
});

这是我的小提琴的链接

http://jsfiddle.net/ricobano/FfSjL/2/

我想在上班前试一试,但我只完成了一半。

这是一个函数,它将为您提供所有事件时间值。 只需在每个对象上调用它,如下所示:

getVals(object_1);
function getVals(obj) {
    var vals = [];
    for (var i = 0, len = obj.length; i < len; i++) {
        for(prop in obj[i]) {
            if(prop === 'eventtime') {
                vals.push(obj[i][prop]);
            }
        }
    };
    return vals;
}

我希望这至少可以帮助您更接近结果。

另外,我只是想指出您的对象中存在一些语法错误。 我为您修复了它们:

object_1 = [
    {'value': '9:00', 'text':'9:00 am', 'eventtime':'09:00:00' },
    {'value': '9:30', 'text':'9:30 am', 'eventtime':'09:30:00' },
    {'value': '10:00', 'text':'10:00 am', 'eventtime':'10:00:00' },
    {'value': '10:30', 'text':'10:30 am', 'eventtime':'10:30:00' },
    {'value': '11:00', 'text':'11:00 am', 'eventtime':'11:00:00' },
    {'value': '11:30', 'text':'11:30 am', 'eventtime':'11:30:00' }
];
object_2 = [
    {'eventtime': '10:30:00'},
    {'eventtime': '11:00:00'}
];

将其与@techfoobar非常好的解决方案相结合,它似乎对我有用:

var values = object_2.map(function(item) {
    return item['eventtime'];
});
var result = object_1.filter(function(item) {
    if(values.indexOf(item['eventtime']) !== -1) {
        return false;
    }
    return true;
});
console.log(result);

你可以使用 jQuery extend 函数来做到这一点

http://api.jquery.com/jQuery.extend/

var object = $.extend({}, object1, object2);