删除集合中不匹配的元素

时间:2015-07-17 13:31:47

标签: javascript jquery arrays collections filter

我有以下结构 -

{  
   "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"
          }
       ]
    } 

5 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用fruits的每个元素遍历links数组,并针对source检查targetid每个水果。如果至少有一个不匹配,请从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;
}

DEMO

答案 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"

进行比较的值进行拆分
相关问题