我有这个数组,我根据存储在数据库中的一些数据创建:
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>
此数据需要按距离排序。我的问题是:
chdata
和pcdata
之间的匹配关联/交叉pcaid
和YourID
。答案 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
)的数据,或直接访问其属性。