0

我有两个 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' },
];
4

8 回答 8

4

这是一种方法:

// 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);
});
于 2013-09-24T15:28:04.640 回答
0

尝试这个:

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];
}
于 2013-09-24T15:17:11.453 回答
0

您可以使用

// 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'],则可以使用 native indexOf,这比 javascript 循环快得多。

于 2013-09-24T15:21:42.190 回答
0
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 链接:http: //jsfiddle.net/androdify/5ukBF/

注意:它将修改 object_1 数组。

于 2013-09-24T15:32:17.563 回答
0

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

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]);
    }
}
于 2013-09-24T15:35:26.433 回答
0

这似乎工作正常

 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/

于 2013-09-24T16:07:35.193 回答
0

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

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

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);
于 2013-09-24T16:47:08.647 回答
-3

您可以使用 jQuery 扩展功能来做到这一点

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

var object = $.extend({}, object1, object2);
于 2013-09-24T15:12:48.837 回答