如何获取具有嵌套属性的Javascript对象的子集?

时间:2018-06-21 14:33:52

标签: javascript arrays angular typescript object

我正在使用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)来提取精简版的数组?

5 个答案:

答案 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" }