Удаление различий между объектами и массивами из разных массивов

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' },
];
Теги:
object

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);
});
  • 0
    Круто, это как мой ответ, но упрощено благодаря новым методам массива es5. Но следует отметить, что не работает на старых браузерах
  • 0
    Вы можете сделать то же самое, используя jQuery $ .map и $ .grep.
Показать ещё 1 комментарий
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);
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/

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]);
    }
}
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.

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];
}
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'], то вы можете использовать собственный indexOf, который намного быстрее, чем цикл javascript.

-2

Вы можете сделать это с помощью функции расширения jQuery

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

var object = $.extend({}, object1, object2);
  • 0
    Как бы слияние удалить объект?
  • 0
    Это плохой ответ. Пожалуйста, не размещайте ссылки, особенно если они не отвечают на вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню