删除集合中不匹配的元素

Remove elements where no match in a collection

本文关键字:元素 不匹配 集合 删除      更新时间:2023-09-26

我有以下结构-

{  
   "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检查sourcetarget。如果至少有一个不匹配,请从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" 进行比较