[英]Filter one array using values from another array using linqjs
第一个是对象数组:
let objectArray = [{
FullName: "Person1",
PersonId: "id1"
},
{
FullName: "Person2",
PersonId: "id2"
},
{
FullName: "Person3",
PersonId: "id3"
},
{
FullName: "Person4",
PersonId: "id4"
}
];
第二个是包含一些ID的字符串数组。
let idsArray= ["id1", "id2", "id3"];
我需要删除ID包含在第二个数组中的第一个数组的对象。
预期结果:
firstArray = [{
FullName: "Person4",
PersonId: "id4"
}];
浏览Linqjs
文档时,我发现Except()
方法允许我使用第二个数组作为“过滤器”从第一个数组中删除元素。
为了使用这种方法,我需要创建一个新的阵列objectArray
只包含其ID包含在元素idsArray
使用它作为一个参数。
例:
let filteredArray = Enumerable.From(objectArray).Except(theNewArray).ToArray();
要创建这个新数组,我可以使用Linqjs
Where()
方法。
我的问题从这里开始,因为考虑到我要过滤的ID数组,我不知道如何创建这个新数组。
您可以使用filter()
过滤数组。 使用new Set()
创建一个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 => ...);
您可以使用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)
您可以将Array.prototype.filter
方法与indexOf
结合使用,以测试是否在要排除的ID数组中找到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。
您可以使用带有对象数组和列参数的linq.js
Except
,以排除不需要的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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.