Фильтруйте один массив, используя значения из другого массива, используя linqjs - PullRequest
0 голосов
/ 03 июля 2018

Первый - это массив объектов:

let objectArray = [{
    FullName: "Person1",
    PersonId: "id1"
  },
  {
    FullName: "Person2",
    PersonId: "id2"
  },
  {
    FullName: "Person3",
    PersonId: "id3"
  },
  {
    FullName: "Person4",
    PersonId: "id4"
  }
];

Второй - массив строк, содержащих несколько идентификаторов.

let idsArray= ["id1", "id2", "id3"];

Мне нужно удалить объекты первого массива, чьи идентификаторы содержатся во втором массиве.

Ожидаемый результат:

firstArray = [{
  FullName: "Person4",
  PersonId: "id4"
}];

Изучение документации Linqjs Я обнаружил, что метод Except() позволяет мне удалять элементы из первого массива, используя второй в качестве «фильтра».

Чтобы использовать этот метод, мне нужно создать новый массив из objectArray, который содержит только элементы, идентификаторы которых содержатся в idsArray, чтобы использовать его в качестве параметра.

Пример:

let filteredArray = Enumerable.From(objectArray).Except(theNewArray).ToArray();

Для создания этого нового массива я могу использовать метод Where() из Linqjs.

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

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

Вы можете взять Except из linq.js с массивом объектов и параметром столбца, чтобы исключить нежелательные PersonId.

var objectArray = [{ FullName: "Person1", PersonId: "id1" }, { FullName: "Person2", PersonId: "id2" }, { FullName: "Person3", PersonId: "id3" }, { FullName: "Person4", PersonId: "id4" }],
    idsArray = ["id1", "id2", "id3"],
    result = Enumerable
        .From(objectArray)
        .Except(
            Enumerable.From(idsArray).Select("{ PersonId: $ }"),
            "$.PersonId"
        )
        .ToArray();

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>
0 голосов
/ 03 июля 2018

Вы можете использовать Vanilla JavaScript array.filter и array.includes следующим образом:

let objectArray = [
  {FullName: "Person1", PersonId: "id1"},
  {FullName: "Person2", PersonId: "id2"},
  {FullName: "Person3", PersonId: "id3"},
  {FullName: "Person4", PersonId: "id4"}
];
    
  let excludeIdsArray= ["id1", "id2", "id3"];
  
  let newObj = objectArray.filter(obj => !excludeIdsArray.includes(obj.PersonId))
  
  console.log(newObj)

или , вы можете использовать array.reduce и array.includes следующим образом:

let objectArray = [
  {FullName: "Person1", PersonId: "id1"},
  {FullName: "Person2", PersonId: "id2"},
  {FullName: "Person3", PersonId: "id3"},
  {FullName: "Person4", PersonId: "id4"}
];
        
let excludeIdsArray= ["id1", "id2", "id3"];

let newObj = objectArray.reduce((arr, myObject) => {
  if(!excludeIdsArray.includes(myObject.PersonId)) {
    arr.push(myObject)
  } 
  return arr
}, [])
  

console.log(newObj)
0 голосов
/ 03 июля 2018

Вы можете использовать метод Array.prototype.filter в сочетании с indexOf, чтобы проверить, найдено ли свойство PersonId в массиве идентификаторов для исключения - если это не так, добавьте его в новый filteredArray. См. Ниже, например:

let objects = [{
    FullName: "Person1",
    PersonId: "id1"
  },
  {
    FullName: "Person2",
    PersonId: "id2"
  },
  {
    FullName: "Person3",
    PersonId: "id3"
  },
  {
    FullName: "Person4",
    PersonId: "id4"
  }
];

let toDelete = ["id1", "id2", "id3"];

//just use Array.prototype.filter method to remove unwanted
var filteredObjects = objects.filter(function(element) {
  return toDelete.indexOf(element.PersonId) === -1;
});

console.log(filteredObjects);

Это достигается с помощью ванильного JavaScript. Я бы посоветовал вам удалить linqjs из базы кода вашего проекта, если это единственное, для чего вы его используете.

0 голосов
/ 03 июля 2018

Вы можете использовать filter() для фильтрации массива. Используйте new Set() для создания заданного объекта. Это облегчит проверку, если PersonId существует. Нет необходимости повторять каждый filter()

let objectArray = [
  {FullName: "Person1",PersonId: "id1"},
  {FullName: "Person2",PersonId: "id2"},
  {FullName: "Person3",PersonId: "id3"},
  {FullName: "Person4",PersonId: "id4"}
];

let idsArray = ["id1", "id2", "id3"];

let idsToRemove = new Set(idsArray);
let result = objectArray.filter(o => !idsToRemove.has(o.PersonId));

console.log(result);

Другая опция использует includes() для проверки, содержит ли массив определенную строку.

let objectArray = [
  {FullName: "Person1",PersonId: "id1"},
  {FullName: "Person2",PersonId: "id2"},
  {FullName: "Person3",PersonId: "id3"},
  {FullName: "Person4",PersonId: "id4"}
];

let idsArray = ["id1", "id2", "id3"];

let result = objectArray.filter(o => !idsArray.includes(o.PersonId));

console.log(result);

Примечание: Если вы не хотите новую переменную, вы можете переопределить существующую переменную как:

objectArray = objectArray.filter(o => ...);
...