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 に答える