4

次の方法で _.pick メソッドを使用しています

オブジェクトの配列内の各オブジェクトから取得したいプロパティ名に過ぎない文字列の配列があるとします

var wantedPropArray=["prop1","prop2","prop3.name"];

以下は私のオブジェクト配列です

var objectArray = [
        {"prop1":"prop1Data1","prop2":"prop2Data1","prop3":{"name":"Tom","age":"24","class":"graduate"},"prop4":"prop4Data1","prop5":"prop5Data1"},
        {"prop1":"prop1Data2","prop2":"prop2Data2","prop3":{"name":"Cat","age":"24","class":"graduate"},"prop4":"prop4Data2","prop5":"prop5Data2"}
        {"prop1":"prop1Data3","prop2":"prop2Data3","prop3":{"name":"Tom","age":"24","class":"graduate"},"prop4":"prop4Data3","prop5":"prop5Data3"}
        {"prop1":"prop1Data4","prop2":"prop2Data4","prop3":{"name":"Tom","age":"24","class":"graduate"},"prop4":"prop4Data4","prop5":"prop5Data4"}
    ]
for( var item in objectArray ){          
    var objectArrayOnlySelectedProperties = _.pick(objectArray[item] , wantedPropArray);
}

最初の反復で objectArrayOnlySelectedProperties データを確認できるとします。

objectArrayOnlySelectedProperties = {"prop1":"prop1Data1","prop2":"prop2Data1"};

私はそれが私にこのような結果を与えることを期待しています

objectArrayOnlySelectedProperties = {"prop1":"prop1Data1","prop2":"prop2Data1","prop3.name":"Tom"};

私が言いたいのは、_.pick メソッドは prop3 を調べて prop3.name を取得できないということです。アンダースコアの pick メソッドを使用して、配列内の各オブジェクトのサブプロパティを一致させる方法を誰でも提案できますか?

前もって感謝します

4

6 に答える 6

3

これは、そのままでは underscorejs ではサポートされていないようです。しかし、ミックスインとしてサポートを提供するこの要点があります。

https://gist.github.com/furf/3208381

上記の要点を使用して必要なことを行うコードを次に示します: http://jsfiddle.net/wHXCv/1/

_.mixin({
  deep: function (obj, key) {
    var keys = key.split('.'),
        i = 0,
        value = null,
        n = keys.length;

      while ((obj = obj[keys[i++]]) != null && i < n) {};
      value = i < n ? void 0 : obj;
      var result = {};
      result[key]=value;
      return result;
  }
});

var objectArray = [
                 {"prop1":"prop1Data1","prop2":"prop2Data1","prop3":{"name":"Tom","age":"24","class":"graduate"},"prop4":"prop4Data1","prop5":"prop5Data1"},
                 {"prop1":"prop1Data2","prop2":"prop2Data2","prop3":{"name":"Cat","age":"24","class":"graduate"},"prop4":"prop4Data2","prop5":"prop5Data2"},
                 {"prop1":"prop1Data3","prop2":"prop2Data3","prop3":{"name":"Tom","age":"24","class":"graduate"},"prop4":"prop4Data3","prop5":"prop5Data3"},
                 {"prop1":"prop1Data4","prop2":"prop2Data4","prop3":{"name":"Tom","age":"24","class":"graduate"},"prop4":"prop4Data4","prop5":"prop5Data4"}];

var plucked = function(o, wantedPropArray) {
    return _.reduce(wantedPropArray, function(acc, val){
        acc.push(_.deep(o,val));
        return acc;
    },[]);
}

var answer = _.map(objectArray, function(o){
    return plucked(o, ["prop1","prop2","prop3.name"]);
});

console.log(JSON.stringify(answer));
于 2013-03-05T11:28:27.987 に答える
2

Underscore.js についてはわかりませんが、次のコードを試してみてください。

function pick(obj,list){
    var newObj={};
    for(var i=0;i<list.length;i++){
        var str=list[i].split('.');
        var o=obj[str[0]];
        for(var j=1;j<str.length;j++){
            o=o[str[j]];
        }
        newObj[list[i]]=o;
    }
    return newObj;
}
于 2013-03-05T11:36:12.567 に答える
0

lodash には、深いオブジェクト プロパティをチェックして設定するための優れたメソッドがいくつかあります: has、set、および get。これらの関数を使用して、独自の deepPick / deepPluck 関数を構築できます。以下は、lodash に基づいて構築され、組み込みの Array.reduce メソッドを使用する ES6 スタイルの関数です。lodash は、ネストされたプロパティにドット区切り文字を使用することに注意してください。

/**
 * Deep pick / pluck properties.
 *
 * @param {object} the source object
 * @param {array[string]} the properties to pick
 */
function deepPick (source, props) {
  return props.reduce((result, key) => {
    const exists = lodash.has(source, key);

    if (exists) {
      lodash.set(result, key, lodash.get(source, key));
    }

    return result;
  }, {});
}
于 2016-06-24T21:59:40.370 に答える
0

このための簡単な要点を作成しました: https://gist.github.com/peterslivka/9055188

_.mixin({ 
    pickDeep: function(obj) {
        var copy = {},
            keys = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1));

        this.each(keys, function(key) {
            var subKeys = key.split('.');
            key = subKeys.shift();

            if (key in obj) {
                // pick nested properties
                if(subKeys.length>0) {
                    // extend property (if defined before)
                    if(copy[key]) {
                        _.extend(copy[key], _.pickDeep(obj[key], subKeys.join('.')));
                    }
                    else {
                        copy[key] = _.pickDeep(obj[key], subKeys.join('.'));
                    }
                }
                else {
                    copy[key] = obj[key];
                }
            }
        });

        return copy;
    }
});

ここで実際の例を見つけることができます: http://jsfiddle.net/TFfHk/

于 2014-02-17T17:52:27.607 に答える
0

誰かがここに道を見つけた場合に備えて。機能はあなた_.pluckが望むものです。アンダースコアが付いています。

http://underscorejs.org/#pluck

于 2016-01-11T20:07:06.587 に答える