简体   繁体   English

结构和键替换的对象数组

[英]Array of objects structuring and key replacing

I have an array of objects like this (Data): 我有一个这样的对象数组(数据):

[
  {content: someString, tag: someString, data: someString, author: someId},
  {content: someString, tag: someString, data: someString, author: someId},
  {content: someString, tag: someString, data: someString, author: someId},
  {content: someString, tag: someString, data: someString, author: someId},
]

I have another array of object like this (UserData): 我有另一个像这样的对象数组(UserData):

[
  {author: someId, firstName: someString, lastName: someString},
  {author: someId, firstName: someString, lastName: someString},
]

What i want is an object like this: 我想要的是这样一个对象:

{
  authorFullName: [{content: someString, tag: someString, date: someString},
                   {content: someString, tag: someString, date: someString}],
  authorFullName: [{content: someString, tag: someString, date: someString},
                   {content: someString, tag: someString, date: someString}]
}

I know I can restructure and make an object with the Data as the array and the authorID as the key like this: 我知道我可以使用Data作为数组重构并创建一个对象,并将authorID作为键,如下所示:

    const newObject = OldArrayOfObjects.reduce((result, item) => ({
     ...result,
     [item.author]: [
       ...(result[item.author] || []),
       { content: item.content, tag: item.tag, date: item.date },
     ],
   }), {});

But how do i also replace the authorId with with the full name from the UserData array?? 但是我如何用UserData数组中的全名替换authorId? Working with objects and arrays like this is hard.. 使用像这样的对象和数组很难..

You can use reduce() , filter() and map() methods to get desired result. 您可以使用reduce()filter()map()方法来获得所需的结果。

 var data = [ {content: '1someString', tag: 'someString', data: 'someString', author: 1}, {content: '2someString', tag: 'someString', data: 'someString', author: 2}, {content: '3someString', tag: 'someString', data: 'someString', author: 2}, {content: '4someString', tag: 'someString', data: 'someString', author: 1}, ] var users = [ {author: 1, firstName: 'aFirst', lastName: 'aLast'}, {author: 2, firstName: 'bFirst', lastName: 'bLast'}, ] var result = users.reduce(function(r, e) { var name = `${e.firstName} ${e.lastName}`; r[name] = data.filter(a => a.author == e.author) .map(({content, tag, data}) => ({content, tag, data})) return r; }, {}) console.log(result) 

var dummy = [
    { content: 'sudo', tag: 'sudo', data: 'sudo', author: 1 },
    { content: 'sudo', tag: 'sudo', data: 'sudo', author: 2 },
    { content: 'sudo', tag: 'sudo', data: 'sudo', author: 1 },
    { content: 'sudo', tag: 'sudo', data: 'sudo', author: 2 },
];

var test = [
    { author: 1, firstName: 'ragav simha', lastName: 'ss' },
    { author: 2, firstName: 'ragav ', lastName: 'ragavmm ' },
];

const result = test.reduce((acc, item) => {
    const newArray = dummy.filter((elem) => {
        return elem.author == item.author
    });
    const username = `${item.firstName} ${item.lastName}`;
    acc[username] = newArray;
    return acc;
}, {});

console.log(result);

result 结果

  { 'ragav simhass': 
   [ { content: 'sudo', tag: 'sudo', data: 'sudo', author: 1 },
     { content: 'sudo', tag: 'sudo', data: 'sudo', author: 1 } ],
  'ragav ragavmm ': 
   [ { content: 'sudo', tag: 'sudo', data: 'sudo', author: 2 },
     { content: 'sudo', tag: 'sudo', data: 'sudo', author: 2 } ] }

You could take a Map for keeping the same reference to an array for each author. 您可以使用Map为每个作者保持对数组的相同引用。

 var data = [{ content: 'someString1', tag: '', data: 'someString1', author: 1 }, { content: 'someString2', tag: '', data: 'someString2', author: 2 }, { content: 'someString3', tag: '', data: 'someString3', author: 2 }, { content: 'someString4', tag: '', data: 'someString4', author: 1 }], authors = [{ author: 1, firstName: 'Jane', lastName: 'Goodall' }, { author: 2, firstName: 'John', lastName: 'Doe' }], map=new Map, result = Object.assign(...authors.map(({ author, firstName, lastName, values = [] }) => { map.set(author, values); return { [[firstName, lastName].join(' ')]: values }; })); data.forEach(o => map.get(o.author).push(o)); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM