使用Javascript或jQuery将Array-String转换为Object

时间:2012-06-20 13:12:53

标签: javascript jquery object

我在页面上列出了每个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?

5 个答案:

答案 0 :(得分:5)

您的listy是一个字符串,而不是一个数组。将您的第一个代码块更改为:

 listy = $("*[id]").map(function(){
    return this.id;
 }).get();

http://jsfiddle.net/P7YvU/

至于创建索引整个文档的对象:出于什么目的?当你可以直接解析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,这并不成立,我会说这种说法可能属实。这一切归结为:

  • 包含ID的元素数量
  • 您想要执行的搜索次数

如果第一个通常是低常规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/

它会

  1. 创建一个缓存来存储现有元素的id,这样每次要生成新ID时都不会产生性能开销。
  2. 自动根据您传递给的标记名称生成增量ID 它。
  3. 如果您真的打算使用id,请更新缓存。
  4. 为方便起见,我只是在控制台上打印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
)