У меня есть два объекта 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);
});
Я хотел сделать снимок, прежде чем я ушел на работу, но я получил только половину пути.
Здесь функция, которая даст вам все значения времени события. Просто назовите его на каждом объекте так:
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);
это похоже на работу
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);
});
Вот ссылка на мою скрипку
Я думаю, простое решение (протестировано):
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]);
}
}
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.
Попробуй это:
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];
}
Вы можете использовать
// 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.
Вы можете сделать это с помощью функции расширения jQuery
http://api.jquery.com/jQuery.extend/
var object = $.extend({}, object1, object2);