Javascript 从不同数组中删除对象/数组差异
我有两个JavaScript对象:Javascript 从不同数组中删除对象/数组差异,javascript,jquery,object,Javascript,Jquery,Object,我有两个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:3
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' },
];
您可以使用jQuery扩展函数来实现这一点 试试这个:
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;
}
}
}
上面的解决方案保留了数组键,但如果要重置它们,可以对循环执行另一个
var object_new = [];
for (var i in object_1) {
object_new[object_new.length] = object_1[i];
}
你可以用
// 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);
}
}
演示:
请注意,如果首先将[{'eventtime':'10:30:00'},{'eventtime':'11:00:00'}]
转换为['10:30:00','11:00:00']
,则可以使用本机索引,这比javascript循环快得多。这里有一种方法:
// 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);
});
JSIDLE链接:
注意:它将修改object_1数组。我认为,简单的解决方案是(经过测试的):
这似乎行得通
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);
});
这是我小提琴的链接
我想在上班前试一试,但我只走了一半
下面是一个函数,它将为您提供所有eventtime值。只需对每个对象调用它,如下所示:
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;
}
再加上@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);
请注意,这个问题与JSON完全无关。您似乎混淆了JavaScript对象文本(JavaScript语言语法的结构)和JSON(一种独立于语言的数据交换格式,如XML或CSV)。我将相应地编辑您的问题。另请参见:。合并如何删除对象?这是一个糟糕的答案。请不要只是发布链接,特别是如果它实际上没有回答问题的话。很酷,这和我的答案一样,但是由于新的es5数组方法,它被简化了。但是需要注意的是,在旧浏览器上不起作用。您可以使用jQuery的$.map和$.grep完成同样的事情
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);
});
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'}
];
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);