我正在使用Angular进行开发,并且具有以下对象的Typescript数组:
docs = [
{
id: '1',
type: {
id: 1
desc: 'Category 1',
}
title: 'Foo",
date: '2018-06-21',
attachments: [
{ id: 51, filename: 'foo.pdf', title: 'Foo' },
{ id: 20, filename: 'bar.doc', title: 'Bar' }
]
},
{
id: '2',
type: {
id: 2
desc: 'Category 2',
}
title: 'Bar",
date: '2018-06-21',
attachments: [
{ id: 15, filename: 'foobar.xls', title: 'Foobar' },
{ id: 201, filename: 'example.doc', title: 'Example' }
]
}
]
我只需要获取属性的一个子集,就像这样:
docs = [
{
id: '1',
type: {
id: 1
desc: 'Category 1',
}
attachments: [
{ id: 51 },
{ id: 20 }
]
},
{
id: '2',
type: {
id: 2
desc: 'Category 2',
}
attachments: [
{ id: 15 },
{ id: 201 }
]
}
]
我该如何实现? 是我要创建一个解析器还是存在任何聪明的方法(例如Lodash)来提取精简版的数组?
答案 0 :(得分:3)
acrord32.exe C:\document\a.pdf
看看这个。这很完美!
答案 1 :(得分:1)
您可以使用array.map和对象分解来仅提取所需的属性。
还可以使用JSON.parse和JSON.stringify进行复制,并避免出现副作用。
docs2 = JSON.parse(JSON.stringify(docs)).map(
({id, type, attachements}) =>
({ id,
type,
attachements: attachements.map(({id}) => ({id})
})
)
答案 2 :(得分:1)
您可以将Array.map
用于对象传播,例如:
const mapSubset = ({ id, type, attachments }) => {
return { id, type, attachments: attachments.map( {id} => id ) };
};
const subset = docs.map( mapSubset );
答案 3 :(得分:0)
我一直在寻找一种非特定的方式来完成此操作或其他类似情况,到目前为止,我已经想到以下几点:
IMapping<T>
类型,该类型定义了映射每个属性的方式。IMappingFunction<T>
界面,该界面确定如何映射特定事物:以下代码进行了演示:
type IMapping<T> = {
[P in keyof T]: IMapping<T[P]> | IMappingFunction<T[P]>;
}
interface IMappingFunction<T>{
(t: T): T | Partial<T>
}
class Person{
name: string;
lastName: string;
}
const obj: IMapping<Person> = {
name: s => s.toUpperCase(),
lastName: s => s
}
function map<T>(obj: T, mapping: IMapping<T>) {
return Object.keys(obj)
.map(prop => {
const propMapping = mapping[prop];
return {
key: prop,
value: typeof propMapping === 'function' ?
propMapping(obj[prop]) :
map(obj, propMapping)
};
})
.reduce((acc, prop) => ({...acc, [prop.key]: prop.value}), { });
}
console.log(map({ name: 'Name', lastName: 'LastName'}, obj));
要查看可运行的代码段,请here
答案 4 :(得分:-1)
您需要保持原始阵列完整吗?如果没有,则可以使用for循环遍历对象列表,并使用“删除”运算符删除不再需要的属性。
例如:
var Employee = {
firstname: "Mohammed",
lastname: "Haddad"
}
delete Employee.firstname;
console.log(Employee);
// expected output: { lastname: "Haddad" }