Вложеная фильтрация массива Java Script

278
21 мая 2017, 23:16

Я имею следующий массив объектов:

rows = [
  {
    name: "user1",
    previlege: "Filtering"
  },
  {
    name: "user2",
    previlege: "Reportering"
  },
  {
    name: "user3",
    previlege: "Filtering"
  }
]

И другой массив объектов:

selected = [
  {
    name: "user1",
    previlege: "Filtering"
  },
  {
    name: "user2",
    previlege: "Reportering"
  },
]

Мне нужно отфильтровать первый массив удалив все совпадения с вторим. То есть я должен получить

rows = [
  {
    name: "user3",
    previlege: "Filtering"
  }
]

Я пробую сделать это так:

this.array = this.rows.filter((current)=>
  JSON.stringify(current) !== JSON.stringify(this.selected[0])
);

Но логически удаляется только первая запись. Я понимаю, что мне нужно что-то вроде вложенной функции filter или просто вложений цикл for чтоб пройтись по массиве selected, но все мои попытки не увенчались успехом. Помогите мне отфильтровать этот массив

Answer 1

Просто отфильтровать первый массив, проверяя, нет ли похожих данных во втором. Я использовал поиск по именю юзера с помощью .some():

var rows = [ 
  { 
    name: "user1", 
    previlege: "Filtering" 
  }, 
  { 
    name: "user2", 
    previlege: "Reportering" 
  }, 
  { 
    name: "user3", 
    previlege: "Filtering" 
  } 
]; 
 
var selected = [ 
  { 
    name: "user1", 
    previlege: "Filtering" 
  }, 
  { 
    name: "user2", 
    previlege: "Reportering" 
  }, 
] 
 
var array = rows.filter(r => !selected.some(s => s.name == r.name)); 
 
 
console.log(array);

Говоря о вашей реализации - вы фильтровали массив на совпадения с нулевым элементом (JSON.stringify(this.selected[0]))

Answer 2

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

for (var i = 0; i < rows.length; i++) {
   for (var n = 0; n < selected.length; n++) {
        //compare arrays here
        If(rows[i] ==selected[n]){
             return 'arrays are equal'
         }
}
}
Answer 3

Действительно, надо в массиве selected поискать entry,

вашу идею можно переписать вот так:

const rows = [ 
  { 
    name: "user1", 
    previlege: "Filtering" 
  }, 
  { 
    name: "user2", 
    previlege: "Reportering" 
  }, 
  { 
    name: "user3", 
    previlege: "Filtering" 
  } 
] 
const selected = [ 
  { 
    name: "user1", 
    previlege: "Filtering" 
  }, 
  { 
    name: "user2", 
    previlege: "Reportering" 
  }, 
] 
console.log(rows.filter(current=> 
  { 
    const currentString = JSON.stringify(current); //небольшая оптимизация 
    return !selected.some(entry=> JSON.stringify(entry) === currentString); 
  } 
));

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

const rows = [{ 
    name: "user1", 
    previlege: "Filtering" 
  }, 
  { 
    previlege: "Reportering", 
    name: "user2", 
    struct: { 
      a: 1, 
      b: "a" 
    } 
  }, 
  { 
    name: "user3", 
    previlege: "Filtering" 
  } 
] 
const selected = [{ 
    name: "user1", 
    previlege: "Filtering" 
  }, 
  { 
    name: "user2", 
    previlege: "Reportering", 
    struct: { 
      a: 1, 
      b: "a" 
    } 
 
  }, 
]; 
console.log(rows.filter(current => !selected.some(entry => deepEq(entry, current)))); 
 
function deepEq(a, b) { 
  const keysA = Object.keys(a); 
  const keysB = Object.keys(b); 
  if (keysA.length !== keysB.length) { 
    return false; 
  } 
  return !keysA.some(keyA => 
    typeof a[keyA] !== "object" && a[keysA] !== null  
      ? a[keyA] !== b[keyA]  
      : !deepEq(a[keyA], b[keyA])); //рекурсия для объектов 
}

READ ALSO
Какое событие при скроле к другому блоку добавит класс?

Какое событие при скроле к другому блоку добавит класс?

Когда край окна достигнет блока с классомour-mission, то к блоку с классом

230
Автоматическое увеличение высоты DIV

Автоматическое увеличение высоты DIV

Есть вот такой простой чат:

313
Анимация окружности в 3djs

Анимация окружности в 3djs

Есть некая окружностьПоявление которой нужно анимировать

278
css наследование или вроде того

css наследование или вроде того

Вопрос глуповат, но я постоянно забываю, как происходит наследование и выборка(извиняюсь за французский) дочерних элементов в классах?

277