我有以下结构 -
{
"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"
}
]
}
我正在尝试删除链接的部分,其中source和target等于(9和10)和(1和10)。
由于上述与水果部分中任何ID的组合不匹配,因此必须将其删除。
所以我试图迭代每个链接元素,但是如何检查水果对象中的每个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"
}
]
}
答案 0 :(得分:1)
解决此问题的一种方法是使用fruits
的每个元素遍历links
数组,并针对source
检查target
和id
每个水果。如果至少有一个不匹配,请从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来展示我的解决方案。
希望这有帮助!如果您有任何问题,请告诉我。
答案 1 :(得分:1)
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;
}
答案 2 :(得分:0)
要从数组中删除条目而不在数组中留下间隙,请使用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;
}
}
答案 3 :(得分:0)
您可以先构建一个包含id
所有fruits
属性的数组,
然后测试每个链接的target
&amp; source
属性在该列表中。
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));
答案 4 :(得分:-1)
您的问题的答案已在此处给出:
jquery javascript remove object data from JSON object
您只需要将问题val.zipcode
中的json数据和需要与"yourvalue"