2015-11-05 4 views
1

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

Fiddlehttp://jsfiddle.net/kyllle/k02jw2j0/

JS

var exclude = [{ 
    id: 1, 
    name: 'John' 
}]; 

var peopleArr = [{ 
    id: 1, 
    name: 'John' 
}, { 
    id: 2, 
    name: 'James' 
}, { 
    id: 3, 
    name: 'Simon' 
}]; 

var myObj = []; 
for (key in peopleArr) { 
    for (k in exclude) { 

     if (JSON.stringify(peopleArr[key]) != JSON.stringify(exclude[k])) { 

      console.log(peopleArr[key]); 
      myObj.push(peopleArr[key]); 

     } 
    } 
} 

console.log(myObj); 

ответ

1

В предположении, что exclude может иметь несколько элементов, я хотел бы использовать комбинацию filter() и forEach():

var newArray = peopleArr.filter(function(person) { 
    include = true; 
    exclude.forEach(function(exl) { 
     if (JSON.stringify(exl) == JSON.stringify(person)) { 
      include = false; 
      return; 
     } 
    }) 
    if (include) return person; 
}) 

раздвоенной скрипка ->http://jsfiddle.net/6c24rte8/

1

Вы повторяете некоторые JSON.stringify звонки.
Вы можете конвертировать свои массивы в JSON один раз, а затем повторно использовать его. Кроме того, вы можете заменить push на Array.prototype.filter.

var excludeJson = exclude.map(JSON.stringify); 

peopleArr = peopleArr.filter(function(x) { 
    return excludeJson.indexOf(JSON.stringify(x)) === -1; 
}); 

Вот рабочий фрагмент кода:

var exclude = [{ 
 
    id: 1, 
 
    name: 'John' 
 
}]; 
 

 
var peopleArr = [{ 
 
    id: 1, 
 
    name: 'John' 
 
}, { 
 
    id: 2, 
 
    name: 'James' 
 
}, { 
 
    id: 3, 
 
    name: 'Simon' 
 
}]; 
 

 
var excludeJson = exclude.map(JSON.stringify); 
 

 
peopleArr = peopleArr.filter(function(x) { 
 
    return excludeJson.indexOf(JSON.stringify(x)) === -1; 
 
}); 
 

 
document.body.innerText = JSON.stringify(peopleArr);

1

Это может быть достигнуто с .filter и .findIndex

var myObj = peopleArr.filter(function(person){ 
    var idx = exclude.findIndex(function(exc) { return person.id == exc.id && person.name == exc.name; }); 
    return idx == -1; // means current person not found in the exclude list 
}); 

Я явно сравнили фактические свойства б Ack к оригиналу, нет ничего особенно плохого с оригинальным способом сравнения строковой версии (JSON.stringify(e) == JSON.stringify(x) может быть использован в моем примере)

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