2

我正在尝试为我的项目添加“搜索”功能。我想做的是只搜索 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 对象来做到这一点?是否有一个库可以在某处执行此操作,我想编写自己的函数来剥离这些值并自己构建字符串,但不想重新发明轮子。

提前感谢任何提示或指示!

4

3 回答 3

9
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/


于 2012-05-23T17:04:23.600 回答
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(' ');
于 2012-05-23T17:02:15.660 回答
2

对此没有标准功能。

您可以使用下划线的函数,这是代码:

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

更新:

我想知道值的顺序是否重要?

于 2012-05-23T17:03:47.960 回答