如何使用lodash或javascript过滤对象
How to filter the object using lodash or 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
中只有一个或0个对象,就像你的例子一样,你可以使用reduce()
和Object.keys()
var data = {"test1":{"documents":[]},"test2":{"documents":[{"vId":"sdfas23","TypeId":"81","isDeleted":false}],"answerswer":true},"test3":{"documents":[{"vId":"H1mJinyI","TypeId":"82","isDeleted":false}],"answerswer":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)
对于documents
数组中的多个对象,您可以将forEach
循环添加到之前的代码中,以便您获得此(test3.documents
中有两个对象)
var data = {"test1":{"documents":[]},"test2":{"documents":[{"vId":"sdfas23","TypeId":"81","isDeleted":false}],"answerswer":true},"test3":{"documents":[{"vId":"H1mJinyI","TypeId":"82","isDeleted":false},{"vId":"Random","TypeId":"100","isDeleted":false}],"answerswer":true}}
var result = Object.keys(data).reduce(function(a, e) {
if (data[e].documents.length) data[e].documents.forEach(function(p) {
a.push(p.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));
你可以这样做:
- 以一种方式访问每个对象,您可以为它使用相同的表达式。为…in将帮助您获取对象的键,您可以使用
data[key]
来获取对象。 - 现在,一旦我们有了对象,我们知道在哪里看,即
obj.documents
。现在documents是一个数组,我们需要在其中的每个对象中获取TypeId
。为此,你可以创建一个数组并手动向其中推送值,也可以使用array .map. - 现在如果你使用
.map
,它将为每个对象返回一个数组。因此,您必须使用array.concat
将其附加到相同的函数。但是如果你使用.push
,那么跳过这一步。
. .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)
如果属性"documents"总是只有一个对象,只使用_.compact(_.map(data, 'documents[0].TypeId'));
如果属性"documents"有多个对象,使用_.flatten(_.map(data, (item) => _.map(item.documents, 'TypeId')));
示例- https://jsfiddle.net/qvkctvho/1/
这是前面答案的另一个简化版本(no reduce和fancy stuff only map):
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的映射函数以获得您想要的结果。下面是示例代码-
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>
ES6的纯JS解决方案应该是这样的:
var result = Object.keys(data) // get keys as reference when mapping
.map(v => data[v].documents || []) // get all documents
.reduce((x, y) => x.concat(y)) // flatten
.map(v => v.TypeId); // get TypeId
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)
.map(v => data[v].documents || [])
.reduce((x, y) => x.concat(y))
.map(v => v.TypeId);
console.log(result);
相关文章:
- 执行过滤对象数组的方法
- 如何按数组/对象值的倍数过滤对象数组
- 访问KendoUI中Datasource过滤对象的字段
- 通过 nodejs 过滤对象数组
- 如何过滤对象内部深度堆叠的数据(并在之后编辑删除它)
- 如何使用filter函数在javascript中过滤对象
- Javascript:按字符串数组过滤对象数组
- 按对象属性过滤对象的角度
- RXJS5 - 按每个对象包含的可观察性过滤对象数组
- 通过使用 AngularJS 遵循 OR 运算符仅过滤对象中的特定字段
- 在 lodash 中按键过滤对象
- Javascript 过滤对象
- Javascript - 如何按参数过滤对象数组
- 使用过滤器和下划线过滤对象数组
- 过滤对象数组时的无限$digest循环
- 使用Moment.js按“上个月”和“上周”单击时过滤对象数组
- 如何在 javascript 中过滤对象中具有特定后缀的键/值
- 按对象的属性过滤对象的 JavaScript 数组并删除重复项
- 对于循环中仅过滤对象
- 通过ng repeat内的关键帧过滤对象