我在页面上列出了每个DOM元素的id
:
var listy = $("*[id]").map(function(){
return this.id;
}).get().join(',');
因此,listy的示例输出将是:
"home,links,stuff,things"
现在我想将列表Array
转换为Object
,例如:
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
if (arr[i] !== undefined) rv[i] = arr[i];
return rv;
}
但是,它会将所有内容都放在Object
中:
0: "h", 1: "o", 2: "m", etc...
我显然想要的是:
0: "home", 1: "links, 2: "stuff", etc..
我哪里出错了,我从Convert Array to Object
获得了toObject()
这让我想到了一个类似但不同的问题:
Indexing page elements to JSON object? Or jQuery selector it every time?
答案 0 :(得分:5)
您的listy
是一个字符串,而不是一个数组。将您的第一个代码块更改为:
listy = $("*[id]").map(function(){
return this.id;
}).get();
至于创建索引整个文档的对象:出于什么目的?当你可以直接解析DOM时,自己做这件事几乎没有什么好处 - 特别是因为jQuery让它变得如此简单。您可以调用DOMJSONTHING.body.div.h1
并获得相同的结果,而不是调用$('document > body > div > h1').attr('id')
来获取值“home”。
答案 1 :(得分:3)
这可能是您可以编写的最短代码来获取对象:
// your existing code (a tiny bit changed)
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
// this one liner does the trick
var obj = $.extend({}, idArray);
但正如我在其他答案中的评论中所读到的,这种对象结构在您的情况下可能并不是最好的。你想要的是检查一个特定的ID是否已经存在。这个对象
{
0: "ID1",
1: "otherID",
...
}
无济于事。一个更好的对象是你的关联数组对象:
{
ID1: true,
otherID: true,
...
}
因为只需在if
语句中使用此条件进行检查即可轻松确定特定ID:
if (existingIDs[searchedID]) ...
所有不存在的ID都将失败,并且所有存在的ID都将返回true
。但是要将您的ID数组转换为此对象,您应该使用以下代码:
// your existing code (a tiny bit changed)
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
// convert to associative "array"
var existingIDs = {};
$.each(idArray, function() { existingIDs[this] = true; });
或者根据需要的结果,您可以对此进行更优化:
var existingIDs = {};
$("*[id]").each(function() { existingIDs[this.id] = true; });
这会将您现有的ID搜索加速到最大值。检查ID唯一性可能不需要分层对象结构,只要您可以在O(1)中获取有关ID存在的信息。上联想数组对象将为您提供这种超快的可能性。当您使用新ID创建新对象时,只需执行以下操作即可轻松将其添加到现有关联数组对象中:
existingIDs[newID] = true;
就是这样。新ID将与同一个关联数组对象中的其他ID一起缓存。
警告 :我可以看到您的代码隐含了全局(
listy
变量)。如果可能,请注意并避免。
作为@Blazemonger suggests,这并不成立,我会说这种说法可能属实。这一切归结为:
如果第一个通常是低常规HTML页面,其中CSS类比ID更频繁使用,如果第二个足够大,那么this performance test证明关联数组比使用更快一点仅jQuery。 HTML在此测试中使用的是Stackoverflow在移动站点上的问题列表的副本(因此我从源头删除脚本的工作较少)。我故意举了一个真实世界网站内容的例子而不是准备好的测试用例,这个测试用例可以被刻意制造以支持一种或另一种解决方案。
如果您搜索的规模要小得多,那么使用直接转发jQuery会更快,因为它不需要启动关联数组准备并立即开始搜索。
答案 2 :(得分:2)
var str = 'home,links,stuff,things',
obj = {};
$.each(str.split(','), function(index, val) {
obj[index] = val;
});
<强> DEMO 强>
答案 3 :(得分:1)
查看http://jsfiddle.net/ryan_s/XRV2m/
它会
为方便起见,我只是在控制台上打印id。
根据您之前对其他回复的一些评论,我只需要2美分。
答案 4 :(得分:1)
我的代码:
jQuery.ajax({
type: 'POST',
url:'../pages/HomePage.php',
data:{param : val},
dataType:'HTML',
success: function(data)
{
var data = data ;
obj = {};
$.each(data.split(','), function(k, v) {
obj[k]= v;
alert("success");
$("#process_des").val(obj[0]);
});
}
});
我的输出
Array
(
[0] => FILLET SKIN OFF
[1] => SF
)