2012-05-23 48 views
1

我正在尝试为我的项目添加“搜索”功能。我想要做的是仅搜索JSON对象的值,以便在评估对象的成员时,我的正则表达式不会尝试匹配属性名称。Javascript中只有从JSON对象中获取值的方法吗?

请看下面的例子:

var myObj = { 
    'FirstName': 'Joe', 
    'LastName': 'Jones', 
    'Age': 35, 
    'Address': { 
    'City': 'Boise', 
    'State': 'Idaho' 
    } 
}; 
var myObjValues = JSON.stringify(myObj); 
// result: "{"FirstName":"Joe","LastName":"Jones", etc... }" 

不过,我希望得到的是一个字符串的所有值削平用空格隔开一个字符串(或逗号,或者半结肠,或标签)是这样的:

// result: "Joe Jones 35 Boise Idaho" 

我永远不会知道对象是什么。在我上面的示例中,我使用了名称和地址,但对象可以是任何具有任何级别的嵌套对象的任何东西。我只想要最深的属性是字符串和数字。

有没有办法使用JSON对象做到这一点?有没有一个图书馆可以在某个地方做到这一点,我想写我自己的功能,去掉这些数据并自己构建字符串,但不想重新发明轮子。

在此先感谢您的任何提示或指示!

+1

快速for..in循环应该做的伎俩。 – ajm

+2

请注意wong2的回答中的评论:**“我想知道值的顺序是否重要?”**因为,如果确实如此,那么......好吧,您已经到了一条小溪。 – 2012-05-23 17:09:41

+0

我刚刚更新了我的问题,表示我不知道对象是什么,也不知道嵌套对象的深度有多少。我不是一个Javascript大师,所以如果有一个库这样做,我更愿意使用它。感谢for循环的提示,但我的要求是多一点参与,我认为...(?) – Luc

回答

8
var vals = Object.keys(myObj).map(function(k) { return myObj[k]; }); 

http://jsfiddle.net/ezQuv/

并使用.join(' '),如果你想要一个字符串结果。


对于嵌套对象更新的问题,你可以做到这一点...

var vals = function getVals(o) { 
    return Object.keys(o) 
       .map(function(k) { 
         if (o[k] && typeof o[k] === 'object') 
          return getVals(o[k]); 
         else 
          return o[k]; 
        }).join(' '); 
}(myObj); 

http://jsfiddle.net/hKbMS/


或者,如果你喜欢有条件的经营者在if/else语句,如这...

var vals = function getVals(o) { 
    return Object.keys(o) 
       .map(function(k) { 
        return o[k] && typeof o[k] === 'object' ? getVals(o[k]) : o[k]; 
       }).join(' '); 
}(myObj); 

http://jsfiddle.net/hKbMS/1/


+1

+1因为不错和“功能性” 。如果只有一种方法可以删除'function/return'语法fluff ;-)另外,应该注意的是'Object.keys'是ECMAScript第5版中的新内容。 – 2012-05-23 17:06:31

+1

@pst:我认为一些更好的lambda语法可能与ES6一起出现,但是'Object.keys'是ES5特有的,但是'Array.prototype.map'也是如此。 – 2012-05-23 17:08:52

+0

确实如此。我看到一棵树,碰到另一棵树...... – 2012-05-23 17:10:33

4
var myObj = { 
    'FirstName': 'Joe', 
    'LastName': 'Jones', 
    'Age': 35, 
    'City': 'Boise', 
    'State': 'Idaho' 
}; 
var myObjValues = []; 
for(var n in myObj) 
    myObjValues.push(myObj[n]); 
myObjValues = myObjValues.join(' '); 
+0

我不认为这将工作,因为可能有很多嵌套的对象下面这个对象与其他嵌套对象。我只想要最深的对象属性的值。也许我可以使用你的代码进行一些递归和类型检查,但也许还有另一种解决方案?谢谢!! – Luc

2

对此没有标准功能。

您可以使用下划线的values功能,这是代码:

var values = _.values(JSON.stringify(myObj)), 
    values_str = values.join(" "); 

UPDATE:

我不知道是否值事项的顺序?

+1

请链接到图书馆/文档。 – 2012-05-23 17:05:44

+0

@pst谢谢,我已经添加了它。 – wong2

+0

谢谢@ wong2!订单没有关系。使用下划线库的好主意。但是,我目前没有在我的(巨大)项目中使用下划线库,如果可能的话,我想避免它。 jQuery库中是否有等价的方法?我想我可以去掉'values()'方法,但是...好奇... +1 – Luc