Javascript中只有从JSON对象中获取值的方法吗?
我正在尝试为我的项目添加“搜索”功能。我想要做的是仅搜索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对象做到这一点?有没有一个图书馆可以在某个地方做到这一点,我想写我自己的功能,去掉这些数据并自己构建字符串,但不想重新发明轮子。
在此先感谢您的任何提示或指示!
var vals = Object.keys(myObj).map(function(k) { return myObj[k]; });
并使用.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);
或者,如果你喜欢有条件的经营者在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);
+1因为不错和“功能性” 。如果只有一种方法可以删除'function/return'语法fluff ;-)另外,应该注意的是'Object.keys'是ECMAScript第5版中的新内容。 – 2012-05-23 17:06:31
@pst:我认为一些更好的lambda语法可能与ES6一起出现,但是'Object.keys'是ES5特有的,但是'Array.prototype.map'也是如此。 – 2012-05-23 17:08:52
确实如此。我看到一棵树,碰到另一棵树...... – 2012-05-23 17:10:33
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(' ');
我不认为这将工作,因为可能有很多嵌套的对象下面这个对象与其他嵌套对象。我只想要最深的对象属性的值。也许我可以使用你的代码进行一些递归和类型检查,但也许还有另一种解决方案?谢谢!! – Luc
对此没有标准功能。
您可以使用下划线的values功能,这是代码:
var values = _.values(JSON.stringify(myObj)),
values_str = values.join(" ");
UPDATE:
我不知道是否值事项的顺序?
快速for..in循环应该做的伎俩。 – ajm
请注意wong2的回答中的评论:**“我想知道值的顺序是否重要?”**因为,如果确实如此,那么......好吧,您已经到了一条小溪。 – 2012-05-23 17:09:41
我刚刚更新了我的问题,表示我不知道对象是什么,也不知道嵌套对象的深度有多少。我不是一个Javascript大师,所以如果有一个库这样做,我更愿意使用它。感谢for循环的提示,但我的要求是多一点参与,我认为...(?) – Luc