Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript _.pick方法以匹配对象数组中的子属性_Javascript_Underscore.js - Fatal编程技术网

Javascript _.pick方法以匹配对象数组中的子属性

Javascript _.pick方法以匹配对象数组中的子属性,javascript,underscore.js,Javascript,Underscore.js,我以以下方式使用u.pick方法 假设我有一个字符串数组,它只是我想从对象数组中的每个对象获取的属性名 var wantedPropArray=["prop1","prop2","prop3.name"]; 下面是我的对象数组 var objectArray = [ {"prop1":"prop1Data1","prop2":"prop2Data1","prop3":{"name":"Tom","age":"24","class":"graduate"},"prop4":"pr

我以以下方式使用u.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。 任何人都可以建议如何使用下划线的拾取方法来匹配数组中每个对象的子属性


提前感谢

下划线开箱即用似乎不支持此功能。但有一个要点提供了混合支持:

下面是一些使用上述要点来完成所需操作的代码:

混合({
深度:功能(obj,键){
var keys=key.split('.'),
i=0,
值=空,
n=键。长度;
而((obj=obj[keys[i++]])!=null&&i
我不知道下划线.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;
}
功能拾取(对象,列表){
var newObj={};

对于(var i=0;i我已经为这一点创建了一个简单的要点:

您可以在这里找到工作示例:

下划线深拾取插件 我为underline.js创建了这个插件来帮助解决类似的问题

可在NPM和Bower获得

npm install deep_pick
bower install deep_pick
例子:
如果有人在这里找到了方法,
。.pull
函数就是您想要的。带有下划线


lodash有一些检查和设置深度对象属性的好方法:has、set和get。您可以使用这些函数来构建自己的deepPick/deeppulk函数。下面是一个ES6风格的函数,它构建在lodash的基础上,并使用内置的Array.reduce方法。请注意,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;
  }, {});
}

您提供的链接很好,但我是否可以同时获取键和值而不是仅获取值,我的意思是基本上我想要相同的对象,但只具有选定的属性。@bhargav,我将其整理了一点-早期的解决方案让我很恼火:)我不想使用抽取的解决方案,我想将子属性作为单独的项来获取,比如[{“prop3.name”:“tom”,“prop3.age”:“24”},{“prop3.name”:“cat”,“prop3.age”:“25”}]目前我得到这样的[{“prop3”:“tom”,“age”:“24”},{“prop3”:“name”:“cat”,“age”:“25”}]那么你想把结构展平吗?你只想要一个包含所需属性的平面对象数组?
npm install deep_pick
bower install deep_pick
var input = {
  one: 1,
  two: true,
  three: 'Three',
  four: [1,2,3,4],
  five: {
    alpha: 1,
    beta: 2,
    gamma: 3,
    teta: {
        alef: 1,
        beh: 2,
        peh: 3
    }
  },
  answer: '42.00',
  description: 'This is an object.'
};


var schema = {
  one: true,
  three: true,
  five: {
    alpha: true,
    teta: {
      beh: true
    }
  }
};

deepPick(input, schema); // =>

{
  one: 1,
  three: "Three",
  five: {
    alpha: 1,
    teta: { 
      beh: 2
    }
  }
}
/**
 * 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;
  }, {});
}