删除集合中不匹配的元素
Remove elements where no match in a collection
我有以下结构-
{
"fruits":[
{
"name":"apples",
"id":"1"
},
{
"name":"pears",
"id":"4"
},
{
"name":"grapes",
"id":"5"
}
],
"links":[
{
"source":"1",
"target":"5"
},
{
"source":"4",
"target":"5"
},
{
"source":"9",
"target":"10"
},
{
"source":"1",
"target":"10"
}
]
}
我正在尝试删除链接中源和目标分别等于(9和10(和(1和10(的部分。
这必须删除,因为前面提到的与水果部分中任何id的组合都不匹配。
因此,我尝试对每个链接元素进行迭代,但仍停留在如何检查fruits对象中的每个id上——
for (var i = 0; i < data.links.length; i++) {
// logic
}
我认为它将沿着-的路线
if(data.links[i].source || data.links[i].target) // something
因此,如果data.links[i].source || data.links[i].target
不匹配水果对象中任何ID的组合,则-
delete data.links[i];
所以删除-
{
"source":"9",
"target":"10"
},
{
"source":"1",
"target":"10"
}
因为水果对象中根本不存在9或10(因此移除(,并且尽管1确实存在,但10不存在,因此它与水果对象中任何id的组合都不匹配,因此再次移除。
如何实现最终结构-
{
"fruits":[
{
"name":"apples",
"id":"1"
},
{
"name":"pears",
"id":"4"
},
{
"name":"grapes",
"id":"5"
}
],
"links":[
{
"source":"1",
"target":"5"
},
{
"source":"4",
"target":"5"
}
]
}
实现这一点的一种方法是用links
的每个元素迭代fruits
数组,并对照每个果实的id
检查source
和target
。如果至少有一个不匹配,请从links
中删除该元素。这可以这样实现:
for (var i = data.links.length - 1; i >= 0; i--) {
var sourceExists = false;
var targetExists = false;
// Check source and target against each fruit id
for (var j = 0; j < data.fruits.length; j++){
if (data.links[i].source == data.fruits[j].id){
sourceExists = true;
}
if (data.links[i].target == data.fruits[j].id){
targetExists = true;
}
}
// Remove element if either source or target didn't match
if (!sourceExists || !targetExists){
data.links.splice(i, 1);
}
}
请注意我是如何在links
数组中向后迭代的,因为在向前迭代时,删除元素可能会产生不必要的副作用。这里有一个JSFiddle来演示我的解决方案。
希望这能有所帮助!如果你有任何问题,请告诉我。
function remove(obj) {
// get list of fruit ids
var fruitsIds = obj.fruits.map(function (obj) { return obj.id; });
// loop over the links array
for (var i = 0, l = obj.links.length; i < l; i++) {
var el = obj.links[i];
// if either the source or target id is not found in the fruitsId
// array, remove the object and recalculate the size of the links array
if (fruitsIds.indexOf(el.source) === -1 || fruitsIds.indexOf(el.target) === -1) {
obj.links.splice(i, 1);
l--;
i--;
}
}
return obj;
}
演示
要从数组中删除条目而不在数组中留下间隙,请使用Array#splice
而不是delete
。第一个参数是条目的索引,第二个参数是从该索引开始删除的数量。
因此:
var i = 0;
while (i < data.links.length) {
if (yourDeletionConditionGoesHere) {
// Delete this one
data.links.splice(i, 1);
} else {
// We didn't delete it, so move to the next
++i;
}
}
您可以首先构建一个包含fruits
的所有id
属性的数组,则测试每个链路的CCD_ 13&source
属性在该列表中。
Array.prototype.map
Array.prototype.filter
function rm (j) {
var flist = j.fruits.map(function (o) {
return o.id;
});
j.links = j.links.filter(function (o) {
return flist.indexOf(o.source) > -1 &&
flist.indexOf(o.target) > -1;
});
return j;
}
var jso = {
"fruits":[
{
"name":"apples",
"id":"1"
},
{
"name":"pears",
"id":"4"
},
{
"name":"grapes",
"id":"5"
}
],
"links":[
{
"source":"1",
"target":"5"
},
{
"source":"4",
"target":"5"
},
{
"source":"9",
"target":"10"
},
{
"source":"1",
"target":"10"
}
]
};
console.log(rm(jso));
您的问题的答案已经在这里给出:
jquery javascript从JSON对象中删除对象数据
您只需要拆分问题val.zipcode
中的json数据,并将其值与"yourvalue"
进行比较
- 锚点元素不't使用svg时,请打开EDGE上的href
- 高库存时期时间与时区不匹配
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- react路由器使用简单的javascript路由器配置来处理不匹配的路径
- Javascript:图像与单选按钮的值不匹配
- JQuery:使用clone()生成的元素不采用原始的事件属性
- 元素不会添加到Javascript数组中
- 文本区域(jQuery)的结果不匹配
- Jquery live()绑定没有'I don’我对某些元素不感兴趣
- 如果状态不匹配,则缩小为丑陋
- 设置名称与 XML 的名称生产不匹配的 DOM 元素的属性
- 选择器“app”与任何元素都不匹配
- Angular2 Selector与bundle和ECM6的任何元素都不匹配
- 当匹配的元素不在'未找到
- 当一组元素不总是在同一个父元素中时,如何找到下一个匹配的元素
- 在angularjs 1.4中,由于类型不匹配,选择元素值没有被绑定
- 如果window.location.href不匹配某个字符串,则为元素添加css类
- 删除集合中不匹配的元素
- 选择器“;我的应用程序测试“;与任何元素都不匹配
- 为什么Capybara不匹配AJAX调用后插入的新DOM元素