2013-04-16 2 views
2

У меня есть массив объектов JSONDo Содержит Проверьте JSon объекта

posturlContent = [ 
     { "Title": "Bbc news live", "Content": "<div>this is a test BBC </div>", "Uri": "http://bbc.co.uk" }, 
     { "Title": "CNN news live", "Content": "<div>this is a test CNN</div>", "Uri": "http://cnn.com" }, 
     { "Title": "Youtube news live", "Content": "<div>this is a test Youtube </div>", "Uri": "http://youtube.com" }, 
    ]; 

У меня есть массив JS

uris =["http://cnn.com", "http://abcnews.com",...] 

мне нужно проверить, если какой-либо из элементов URIs массива существует в posturlContent Json obejct а также найти те, которые не выходят. единственный способ, которым я знаю, - это сделать вложенный цикл.

есть ли более простой .inArray или Содержит функцию, которую я могу использовать?

+0

Вы просто хотите проверить или какие-то другие операции там ... ?? –

+0

какая-то операция есть, если они отсутствуют –

ответ

0

Вот ответ без JQuery и без Foreach упаковывают вам нужна старая поддержка браузера ...

for(var i =0; i<posturlContent.length; i++) { 
    var detail = posturlContent[i]; 
    for(var j =0; j<uris.length; j++) { 
    var uri = uris[j]; 
    if (detail.Uri === uri) { 
     console.log('matched ' + detail.Uri); 
    } else { 
     console.log('didnt match ' + detail.Uri); 
    } 
    } 
} 

Если вы хотите игнорировать случай, то вместо того, чтобы === вас может использовать: -

if (new RegExp(uri, "i").test(details.Uri)) 
1

Вы можете использовать $.grep:

$.grep(posturlContent, function(item){return item.Uri == siteUrl}).length > 0 

Если это верно, то элемент находится внутри массива.

Затем завернуть, что в $.each:

$.each(uris, function(){ 
    var siteUrl = this.valueOf(); 
    // Grep and do whatever you need to do. 
}) 

Вы можете удалить этот пункт так:

$.each(uris, function(){ 
    var siteUrl = this.valueOf(); 
    posturlContent = $.grep(posturlContent, function(item){ 
     return item.Uri.toLowerCase() != siteUrl.toLowerCase(); 
    }); 
}) 

Обратите внимание, что мы теперь фильтрации для элементов, которые не соответствуют SiteURL.

+0

есть ли ошибка в Grep? –

+1

Нет, но вы можете использовать 'function (item) {return item.Uri.toLowerCase() == siteUrl.toLowerCase()})'. –

+0

если я нахожу совпадение во время grep, могу ли я удалить этот элемент из массива uris или, так как я в цикле массива, я не могу его удалить? –

0

Вы можете найти его, используя JQuery grep и найти nonExists, принимая разницу;

Array.prototype.diff = function(a) { 
    return this.filter(function(i) {return !(a.indexOf(i) > -1);}); 
}; 

var exists = []; 
jQuery.grep(posturlContent, function(n, i){ 
    var index = uris.indexOf(n.Uri); 
    if(index >=0){ 
     exists.push(uris[index]) 
    } 
}); 

var nonExists = uris.diff(exists) 
+0

Будьте осторожны, расширяя прототип встроенных объектов. Обычно это считается плохой практикой: http: // perfectionkills.com/whats-wrong-with-extension-the-dom/ – cfs

+0

Благодарим вас за информацию, но ее можно переписать как независимую функцию. Потому что эта часть не связана с вопросом. –

0

Вы можете использовать grep() найти Ури, что делать, и не существует. Я не уверен, насколько быстро он сравнивается с написания собственных циклов, но это, конечно, более простой

var posturlContent = [ 
     { "Title": "Bbc news live", "Content": "<div>this is a test BBC </div>", "Uri": "http://bbc.co.uk" }, 
     { "Title": "CNN news live", "Content": "<div>this is a test CNN</div>", "Uri": "http://cnn.com" }, 
     { "Title": "Youtube news live", "Content": "<div>this is a test Youtube </div>", "Uri": "http://youtube.com" }, 
    ]; 

var uris =["http://cnn.com", "http://abcnews.com"]; 

//keep track of URI's that exist and that are missing 
var found = []; 
var missing = []; 

//for is faster than each() 
for(var i=0; i<uris.length; i++) { 
    found.concat($.grep(posturlContent, function(item){return item.Uri === uris[i]}, false)); 
    missing.concat($.grep(posturlContent, function(item){return item.Uri === uris[i]}, true)); 
} 

//do something with found and missing urls 
1

Что делать, если создать объект кэша URL? Вот скрипку http://jsfiddle.net/U94xT/1/

var posturlContent = [ 
    { "Title": "Bbc news live", "Content": "<div>this is a test BBC </div>", "Uri": "http://bbc.co.uk" }, 
    { "Title": "CNN news live", "Content": "<div>this is a test CNN</div>", "Uri": "http://cnn.com" }, 
    { "Title": "Youtube news live", "Content": "<div>this is a test Youtube </div>", "Uri": "http://youtube.com" }, 
]; 
var uris =["http://cnn.com", "http://abcnews.com"]; 

var urisCache = {}; // using object to avoid urls duplicates, that could occur using an array 
for (var i = 0; i < posturlContent.length; i++) { 
    var key = posturlContent[i]["Uri"]; 
    urisCache[key] = true; // or urisCache[key] = posturlContent[i]; if you need to access the corresponding entry from posturlContent 
} 

//now check if the uris array element exist in posturlContent 
for (var i = 0; i < uris.length; i++) { 
    alert(uris[i] in urisCache); 
}