2016-01-02 3 views
-1

Добрый день,Сравнение двух массивов «строк», чтобы проверить, если они равны

У меня есть два массива строк. Строки - это только числовые даты (например: «01/01/2016» ...).

Я хотел бы знать, есть ли хороший/быстрый способ сравнить два массива и удалить строки из одного массива, которых нет во втором.

Пример:

Первый массив: [ "01/01/2016", "02/02/2015", "03/03/2014"]

Второй массив: [ "01/01/2016 "," 02/02/2015 "]

Строку« 03/03/2014 »следует удалить из первого массива.

Я попытался сделать это, хотя для() петель обеих длин массивов, но это, кажется, очень медленно, потому что массивы большие индексы в каждом, как это (около 1000 +.):

for (var a = 0; a < oilDateArray.length; a++) { 
      for (var b = 0; b < fuelDateArray.length; b++) { 
      if (fuelDateArray[b] !== oilDateArray[a]) { 
       console.log("fuelDateArray not present: " + fuelDateArray[b]); 
      } 
      } 
     } 

Есть ли конкретная функция/метод, который я мог бы использовать для ускорения выполнения вышеуказанной операции?

Заранее благодарим за хороший день!

+0

I не думайте, что ответ будет там быстрее. Проверка двух массивов, каждая из которых содержит 1000 строк, с использованием петель(), довольно медленная. –

+0

Можете ли вы обработать свой набор данных, чтобы использовать отсортированные временные метки UNIX? Я могу создать ответ, используя временную сложность «O (n)», если вы можете. – caulitomaz

+0

Я получаю эти даты как данные из веб-службы. Я могу преобразовать его в unix или эпоху, но это, вероятно, будет не очень эффективным способом. –

ответ

2

Попробуйте это:

for (var i = 0; i < firstArray.length; i++){ 
    if (secondArray.indexOf(firstArray[i]) == -1){ // indexOf is -1 if not found 
     firstArray.splice(i, 1); // Remove 1 value at index i 
     i--; // To re-adjust the index value which is 1 less because of the splice 
    } 
} 

Она также может быть немного медленно, вы можете попробовать с массивом: https://jsfiddle.net/tyrsszaw/4

+0

Вам нужно изменить '<=' на '<' и настроить 'i', потому что вы переиндексируете массив, когда элемент удален. –

+0

Вы правы @squint, просто ошибка – paulolol

+0

Вам все равно нужно настроить 'i'.После выполнения '.splice()' следующий индекс становится текущим, поэтому 'i ++' пропускает его. В строке '.splice()' добавьте 'i -'. –

1

с Jquery

$ (массив1) .filter (array2);

+0

Это просто неправильно. Нет поддержки документации для передачи массива строк в '' 'функцию, а затем с помощью' .filter() 'на ней. –

+0

это не так, это работает ... Я просто попробовал ... Прежде чем давать мне отрицание, вы должны попробовать код для себя – JAF

+0

Нет поддержки документации для передачи массива строк функции '$', а затем использования '.filter()' на нем. Перед использованием (или предложением) ознакомьтесь с документацией. Это действительно супер, пупер, что он работает прямо сейчас, но это неподдерживаемая «функция» и может сломаться на любой небольшой выпуск. –

0

я использовать JQuery для операций с массивами и я буду редактировать один для ваших потребностей и вставить здесь, я надеюсь, что это может помочь вам:

var arr1 = ["01/01/2016","02/02/2015", "03/03/2014"]; 
var arr2 = ["01/01/2016", "02/02/2015"]; 
var diff = []; 

jQuery.grep(arr2, function(t) { 
     if (jQuery.inArray(t, arr1) == -1) diff.push(t); 
}); 

alert(diff);​ // what was different will be alerted 

я также нашел этот код на StackOverflow некоторое время назад.

Update: Вот показатели, связанные с темой вы можете быть заинтересованы

Performance of jQuery.grep vs. Array.filter

tldr; говорит, что grep примерно в 3 раза быстрее. Поэтому придерживайтесь моего решения. :)

+0

Спасибо! Как это с точки зрения производительности при сравнении больших массивов (более 1000 предметов)? –

+0

, если вы будете работать со всем, что связано с javascript на стороне клиента, это зависит от клиента на самом деле –

+0

вы можете объяснить свое дело дальше? Например, если вам нужно получить данные из api или любого соединения с базой данных? Или просто какие-то простые даты? –

1

Если у вас есть доступ к Set:

function intersect(arr1, arr2){ 
    var s = new Set(arr1); 
    return arr2.filter(function(el){ 
     return s.has(el); 
    }); 
} 
Смежные вопросы