2013-09-24 68 views
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' }, 
]; 
+1

請注意,這個問題有什麼** **做與JSON在所有。看起來你正在將JavaScript對象文字(JavaScript語言語法的結構)與JSON(獨立於語言的數據交換格式,如XML或CSV)相混淆。我會相應地編輯你的問題。另請參閱:[沒有像「JSON對象」那樣的東西](http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/)。 –

回答

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陣列方法。但應該指出的是,在舊瀏覽器上無效 – Oriol

+0

您可以使用jQuery的$ .map和$ .grep –

+0

完成同樣的事情謝謝!一個好方法 – Maksym

-3

你可以用jQuery的做這個擴展功能

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

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

如何合併移除對象? –

+0

這是一個很差的答案。請不要只發布鏈接,特別是如果它實際上沒有回答問題 –

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 lo運。

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

我想,簡單的解決方案(測試):

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

這似乎工作確定

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

我在我離開工作之前想要開槍,但我只有一半。

這是一個函數,它會給你所有的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; 
} 

我希望至少能幫助您更接近您的結果。

另外,我只想指出在對象內部有幾個語法錯誤。我固定他們爲你:

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);