2013-10-12 4 views
0

У меня есть два массива (данные и data_not_included). Каждый элемент этих массивов имеет идентификаторы и имя attridutes. Я заполняю их таким образом:javascript массивы с несколькими полями сравниваются

data[i] = { 
      name :products.models[i].get('name'), 
      id : products.models[i].get('id') 
      }; 

Теперь я хочу сделать отображение элементов данных, которые не находятся в data_not_included массива. Например, у меня есть

data=[{name: Sugar}{id: 1},{name: Butter}{id: 2},{name: Cola}{id: 3}] 
// and 
data_nat_included = [{name: Sugar}{id: 1},{name: Butter}{id: 2}]. 

Он должен отображать только {name: Cola}{id: 3}.

Вот что я уже сделал:

for(var j=0;j<data_not_icluded.length;j++) 
{ 
    for(var i=0;i<data.length;i++) 
    { 
     if(data[i].id != data_not_icluded[j].id){ 
      //but this doesnt work for me it displayes a lot of element many times 
     } 
    } 
} 
+0

'} {' должны быть запятой, чтобы предотвратить ошибку – Bergi

+0

синтаксиса Вам действительно нужно, чтобы сравнить их по идентификатору или Бы '' == тест хватай (они одни и те же объекты)? – Bergi

ответ

1

Оба ответа асимптотически плохо , Это означает, что они работают в субоптимальное время. Другими словами, это наивные подходы к решению проблемы. Эта проблема более широко известна в области баз данных, где операция соединения является обычным явлением. Также известно, что сложность соединения равна O(log n * n + log m * m), где n - это количество элементов в первой таблице, а m - это количество элементов во второй таблице. Это меньше операций, которые потребуются наивным решением, предлагаемым в других примерах O(n^2).

Однако, если известно больше о ваших данных, как, например, я бы ожидал, что значения будут уникальными и легко сериализуемыми для строки, вы можете даже уменьшить сложность до O(n + m), просто создав хэши объектов, которые вы хотите сравнивать. Вот как это делается:

Где n - количество элементов в первом массиве, а m - количество элементов во втором массиве.

var data = [{ name: "Sugar" }, 
      { id: 1 }, 
      { name: "Butter" }, 
      { id: 2 }, 
      { name: "Cola" }, 
      { id: 3 }]; 
var dataNatIncluded = [{ name: "Sugar" }, 
         { id: 1 }, 
         { name: "Butter" }, 
         { id: 2 }]; 

function join(a, b) { 
    var hashA = {}, hashB = {}, p, result = []; 
    function setter(hash) { 
     return function (element) { hash[JSON.stringify(element)] = element; }; 
    } 
    a.forEach(setter(hashA)); 
    b.forEach(setter(hashB)); 
    for (p in hashB) delete hashA[p]; 
    for (p in hashA) result.push(hashA[p]); 
    return result; 
} 
// [{ name: "Cola" }, { id: 3 }] 
+0

+1, но ваша сложность по-прежнему 'O (n + m)' – Bergi

+0

@Bergi о, да, вы правильно. Нужно исправить это. –

0

Простой способ сделать это:

var vals = []; 

for(var i=0;i<data.length;i++) 
{ 
    var found = false; 
    for(var j=0;j<data_nat.length;j++) 
    { 
     if(data[i].id == data_nat[j].id){ 
      found = true; 
      break; 
     } 
    } 
    if (!found) vals.push(data[i]); 
} 

JSFiddle

0
for(var j=0;j<data_not_icluded.length;j++) 
    for(var i=0;i<data.length;i++) 
     if(data[i].id != data_not_icluded[j].id) 

Думают, что это делает : Для любого нет t включенный объект, показать все объекты, которые не имеют того же идентификатора, что и текущий, не включенный. Это будет отображать много элементов несколько раз, и оно будет отображать объекты, которые находятся в «не включены», но в другой позиции.

Вместо перебираем data, проверьте каждый, что он не включен в data_not_included, а также отображать его иначе:

dataloop: for (var i=0; i<data.length; i++) { 
    for (var j=0; j<data_not_included.length; j++) 
     if (data[i].id == data_not_icluded[j].id) 
      continue dataloop; 
    display(data[i]); 
} 

Или, используя некоторые iteration methods of Arrays:

data.filter(function(d) { 
    return data_not_included.every(function(n) { 
     return d.id != n.id; 
    }); 
}).each(display); 
+0

Youp, вы только что сделали O (log n * n + log m * m) в O (n^2). Читайте о том, как это сделать: http://en.wikipedia.org/wiki/Sort-merge_join –

+0

@wvxvw: 'O (n * m)', если вообще. Конечно, это не очень эффективно, но OP не попросил исполнителя, а простое решение :-) – Bergi

Смежные вопросы