【问题标题】:How can I check for and remove an array item that is no longer needed?如何检查和删除不再需要的数组项?
【发布时间】:2012-06-17 18:33:34
【问题描述】:

我正在使用 Google Maps API v3,并且我有一个标记数组 (markersArray),每个标记都包含一个名为“id”的元素。通过 Ajax,我点击了一个 db 并将当前 ID 值作为一个数组 (tokID) 返回并调用一个“loadMarkers”函数。

在“loadMarkers”函数中,我需要删除任何与从数据库返回的 ID 值不匹配的数组项。我已经研究了 .splice() 和 .filter() 但我一辈子都无法让它发挥作用。

抱歉,没有代码示例。我真的很难过,真的没有什么可做的。

谢谢! 迈克

【问题讨论】:

标签: javascript jquery google-maps google-maps-api-3


【解决方案1】:

大致上你可以做这样的事情,

更新的工作代码

var newIDs; // new IDs found from ajax

newIDs = [1,2]
markersArray = [{ID:1},{ID:8},{ID:2},{ID:4},{ID:6}]
var newMarkers = $.map(markersArray,function(obj,i){
   if(($.inArray(obj.ID,newIDs) == -1))
      return null;
   else
      return obj; 
});

console.log(newMarkers);
​

// now newMarkers holds the filtered markers Array

修改上面的代码以满足您的需要。

$.map$.inArray

查看Working Fiddle

找出服务器发送的额外 ID 的最终代码也是:Fiddle

var newIDs; // new IDs found from ajax

newIDs = [1,2,3,4,5];

markersArray = [{ID:1},{ID:8},{ID:2},{ID:4},{ID:6}];
console.log('Orig Array: ',markersArray);
console.log('From Server: ',newIDs);
var newMarkers = $.map(markersArray,function(obj,i){
    return $.inArray(obj.ID,newIDs) == -1? null: obj;
});

console.log('New Markers Objects: ',newMarkers);
var newMarkerIDs = $.map(markersArray,function(obj,i){
    return $.inArray(obj.ID,newIDs) == -1? null:obj.ID;
});
console.log('New Markers ID Array: ',newMarkerIDs);
var extraIDs = $.map(newIDs,function(val,i){
    return $.inArray(val,newMarkerIDs) == -1 ? val : null;
});

console.log('Extra IDs: ',extraIDs);
​

【讨论】:

  • 嗨,快乐!谢谢回复。在 Firebug 控制台中使用测试值 [{id:1},{id:2},{id:3}][1,3] 尝试您的代码返回 [Object { ID=1}, Object { ID=2}, Object { ID=3}]。这是正确的还是应该只返回[Object { ID=1}, Object { ID=3}]?谢谢!
  • 感谢喜悦!这似乎有效!如果 newIDs 返回的 ID 不在 markerArray 中,我将如何处理?我有一个 addMarkers 函数,我只是不确定在哪里执行它......
  • 或者更好的jsfiddle.net/joycse06/Q6VCv/3 在控制台中按顺序检查所有值。
  • 刚刚写了一个dummyAddmarker 函数来演示如何循环遍历新的 id 并将每个 id 添加为标记。看看这里jsfiddle.net/joycse06/Q6VCv/5
  • 嘿乔伊,一切都很好!还有一个问题。使用您最新的小提琴,我将如何创建一个仅包含原始数组中“未使用”ID 的数组?使用您的示例,这将是 ID 的 6 和 8。谢谢!我尝试使用 inArray 方法进行欺骗,但无法获得正确的结果。
【解决方案2】:

在调用 loadMarkers 之前,我不确定您拥有什么数据以及您获得的数据格式是什么,但如果您使用的是 JQuery,并且您想根据另一个数组中的 id 列表从数组中删除项目,那么您就是这样这样做:

​var orgArray = [{id:1},{id:2},{id:3}];
var newArray = [1,3];

var orgArray = $.map(orgArray, function(v, i){ return $.inArray(v.id, newArray) ? v : null;})​;

console.log(orgArray);

【讨论】:

  • 感谢您的回复!使用您的示例,您能否告诉我在运行代码时如果 newArray 与 orgArray 匹配,我希望看到什么结果?我想我看到它正在删除 id:1?在我的特殊情况下,如果新的 id 值与原始数组中的值相同,我不希望原始数组发生任何事情。谢谢!
  • 您是说即使 newArray 也是一个具有 id 属性的数组,例如 [{id:1},{id:3}]?如果您不想更改原始数组,您想做什么?很抱歉,我在这里没有收到您的问题
  • 很抱歉给您带来了困惑。如果新数组类似于[1,3],我绝对希望原始数组[{id:1},{id:2},{id:3}] 发生变化。如果新数组与原始数组相同,[1,2,3],我不想要任何更改,但似乎当它们相同时,您的代码导致 {id:1} 从数组中删除?如果我对结果的解释不正确,我很抱歉……这对我来说是全新的。 :)
  • 好的。作为测试,当我运行您发布的代码时,在 Firebug 控制台中我会返回 [Object { id=2}, Object { id=3}]。这是预期的输出吗?
  • 是的,这是预期的结果,但我不确定您的要求是什么。您是否只想删除新数组中不存在的 id?
猜你喜欢
  • 2023-01-29
  • 1970-01-01
  • 2014-02-20
  • 2020-06-25
  • 1970-01-01
  • 2019-04-23
  • 2020-01-05
  • 2020-11-04
  • 1970-01-01
相关资源
最近更新 更多