在jQuery中将新数据合并到现有数组中

时间:2012-10-16 10:00:30

标签: jquery arrays

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

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

' pcaid'在chdata和' YourID'在pcdata中是外键,如果你原谅DBA类比,那么这两个数组是相关的。

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

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

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

  1. 如何根据chdatapcdata之间的匹配关联/交叉pcaidYourID
  2. 一旦完成,我打算使用array.sort将其转换为距离顺序。你有没有预见到这个问题。

2 个答案:

答案 0 :(得分: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数组具有内置的sort函数,您可以传入比较器进行自定义排序。在您的情况下,请尝试:

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,如果你得到的话来自服务器的键值格式)。但是在小型数据集上,差异不会很明显。

答案 1 :(得分: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)的数据,或直接访问其属性。

Here's a fiddle