如何使用lodash或javascript过滤对象

我从服务器得到这样的对象,

var data = { test1: { documents: [] }, test2: { documents: [{ vId: 'sdfas23', TypeId: '81', isDeleted: false }], answer: true }, test3: { documents: [{ vId: 'H1mJinyI', TypeId: '82', isDeleted: false }], answer: true } } 

我想从对象中过滤typeId,我期待的结果是

 [81,82] 

任何人都可以帮忙

如果你的例子中只有一个或零个documents对象,你可以使用reduce()Object.keys()

 var data = {"test1":{"documents":[]},"test2":{"documents":[{"vId":"sdfas23","TypeId":"81","isDeleted":false}],"answer":true},"test3":{"documents":[{"vId":"H1mJinyI","TypeId":"82","isDeleted":false}],"answer":true}} var result = Object.keys(data).reduce(function(a, e) { if (data[e].documents[0]) a.push(data[e].documents[0].TypeId); return a; }, []) console.log(result) 

你可以用一行代码来做到这一点:

 _.map(_.flatten(_.map(_.values(data), 'documents')), 'TypeId'); 

这将产生:

 ["81", "82"] 

这给你预期的结果,但不知道你会对此感到满意

 var data= { test1: { documents: [] }, test2: { documents: [{ vId: 'sdfas23', TypeId: '81', isDeleted: false }], answer: true }, test3: { documents: [{ vId: 'H1mJinyI', TypeId: '82', isDeleted: false }], answer: true } } function getIds(array) { var ret = []; for (key in data) { for (key2 in data[key].documents) { ret.push(data[key].documents[key2].TypeId) } } return ret } console.log(getIds(data)); 

你可以做这样的事情:

  1. 以某种方式访问​​每个对象,可以使用相同的expression式。 for … in将帮助你得到一个对象的键,你可以使用data[key]来获得对象。
  2. 现在,一旦我们有对象,我们知道在哪里看obj.documents 。 现在文档是一个数组,我们需要在其中的每个对象中获得TypeId 。 为此,您可以有一个数组并手动推送值,或者您可以使用Array.map 。
  3. 现在,如果使用.map ,它将为每个对象返回一个数组。 所以你将不得不使用array.concat来追加到相同的function。 但是,如果您使用.push ,则跳过此步骤。

For..in + .map + .concat

 var data={test1:{documents:[]},test2:{documents:[{vId:"sdfas23",TypeId:"81",isDeleted:!1}],answer:!0},test3:{documents:[{vId:"H1mJinyI",TypeId:"82",isDeleted:!1}],answer:!0}}; var r = []; for(var k in data){ r = r.concat(data[k].documents.map(function(o){return o.TypeId})); } console.log(r) 

如果属性“文档”总是只有一个对象,只需使用_.compact(_.map(data, 'documents[0].TypeId'));

如果属性“文档”有许多对象,请使用_.flatten(_.map(data, (item) => _.map(item.documents, 'TypeId')));

示例 – https://jsfiddle.net/qvkctvho/1/

这里是以前的答案的另一个简化版本(没有减less花哨的东西只有地图):

 var data= { test1: { documents: [] }, test2: { documents: [{ vId: 'sdfas23', TypeId: '81', isDeleted: false },{ vId: 'sdfas23', TypeId: '85', isDeleted: false }], answer: true }, test3: { documents: [{ vId: 'H1mJinyI', TypeId: '82', isDeleted: false }], answer: true } }; var getTypeIds = function(data){ var ids = []; // get object keys in this case : test1,test2,test3 Object.keys(data).map(function(key){ // loop through each document attribute and extract TypeId attributes data[key].documents.map(function(item){ ids.push(item.TypeId); }); }) return ids; } console.log(getTypeIds(data)); // [ '81', '85', '82' ] 

尝试这个

 Object.getOwnPropertyNames(data).map(function(val, key) { return data[val].documents[0] ? data[val].documents[0].TypeId : ''; }) 

你可以使用lodash的_.map函数来得到你想要的结果。 这里是示例代码 –

 var result = _.map(data, function(v,i){ if(_.isArray(v.documents)) { return v.documents[0].TypeId } return '' } 

在lodash中解决这个问题的最简单的方法是使用flatMap()来获取平面化的documents数组和map()来获取所有的TypeId

 var result = _(data) .flatMap('documents') .map('TypeId') .value(); 
 var data = { test1: { documents: [] }, test2: { documents: [{ vId: 'sdfas23', TypeId: '81', isDeleted: false }], answer: true }, test3: { documents: [{ vId: 'H1mJinyI', TypeId: '82', isDeleted: false }], answer: true } }; var result = _(data) .flatMap('documents') .map('TypeId') .value(); console.log(result); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js"></script>