1

我有这个数组,它是从存储在数据库中的一些数据创建的:

var chdata = [
  {title: "title one",link: "link one",thumb: "image url one",pcaid: "0001"},
  {title: "title two",link: "link two",thumb: "image url two",pcaid: "0002"},
  {title: "title three",link: "link three",thumb: "image url three",pcaid: "0003"},
  {title: "title four",link: "link four",thumb: "image url four",pcaid: "0004"}
];

然后我从以这种格式到达的地理编码服务中提取一些位置数据:

var pcdata = [
  {Distance: "12.2",Latitude: "50.1",Longitude: "0.1",YourID:"0003"},
  {Distance: "80.7",Latitude: "50.4",Longitude: "0.5",YourID:"0001"},
  {Distance: "95.3",Latitude: "50.9",Longitude: "0.7",YourID:"0004"},
  {Distance: "135.1",Latitude: "51.3",Longitude: "0.9",YourID:"0002"},
]

chdata 中的 'pcaid' 和 pcdata 中的 'YourID' 是关联这两个数组的外键,如果您原谅 DBA 类比的话。

我需要通过 chdata 数组“每个()”,显示其中的数据,以及 pcdata 中相关项目的距离。例如在伪代码中:

<a href="link one">
  <img src="image url one" /><br />title one (80.7 miles away)
</a>

此数据需要按距离顺序排列。我的问题是:

  1. 我如何关联/相交chdatapcdata基于 和 之间的pcaid匹配YourID
  2. 完成此操作后,我计划使用 array.sort 将其设置为距离顺序。你预见到这有什么问题吗?
4

2 回答 2

2

对于#1: 这里最好的设置是让你pcdata的数据格式为键值。我会这样称呼的pchash。然后你可以使用这个(相对)简单的语法:

for(var i = 0; i < chdata.length; ++i)
{
    var ch   = chdata[i];
    var dist = pchash[ch.pcaid].distance;
    // Other stuff...
}

要将当前pcdata转换为pchash,您可以使用以下内容:

pchash = {};
for(var i = 0; i < pcdata.length; ++i)
{
    pchash[pcdata[i]['YourID']] = pcdata[i];
}

或者,更好的是,如果您控制服务器,pcdata则以该格式发送开始。

对于 #2: JavaScript 数组具有内置的排序功能,您可以传入一个比较器进行自定义排序。在您的情况下,请尝试:

whatever.sort(function(a, b) {
    return a.Distance - b.Distance;
});

如果这给了你想要的相反,只需a.Distance减去b.Distance

希望有帮助!

PS: 另一个答案建议使用嵌套循环强制执行此操作。如果您有大量数据,我不推荐它:它需要chdata.length * pcdata.length迭代,而这只需要chdata.length + pcdata.length迭代(或者只是chdata.length,如果您从服务器获取键值格式)。但在小型数据集上,差异不会很明显。

于 2012-10-16T10:31:52.347 回答
1

您可以使用以下方法合并对象extend

$.each(chdata, function(i, x) {
  $.each(pcdata, function(j, y) {
    if(x.pcaid === y.YourID) {

      // at this point you have a match, so you could 
      // either extend the object (like below) 
      $.extend(x, y);

      // just access the properties of each object directly, eg:
      alert(x.title + ' is ' + y.Distance + ' miles away');

    }
  });
});

所以循环chdata,然后循环pcdata,找到pcaid匹配的位置YourID,然后合并对象(chdata将包含来自的相应数据pcdata),或者直接访问它们的属性。

这是一个小提琴

于 2012-10-16T10:24:09.343 回答