Javascript: невозможно создать массив на основе сопоставления вложенных значений в 2 массивах - PullRequest
2 голосов
/ 30 апреля 2019

У меня есть 2 массива объектов, и я хочу сделать сопоставление по статье Author и нажать на новый массив

var result4 = [{
    path: "don-t-call-me",
    details: {
        articleTitle: "Don’t call me",
        articleAuthor: "Dave Wood",
    }
},
{
    path: "diary",
    details: {
        articleTitle: "Diary",
        articleAuthor: "Alan Johnson",
    }
}
}]
var result3 = [{
        path: "letters",
        letters: 7
    },
    {
        path: "dont-call-me",
        details: {
            articleTitle: "Don’t call me"
            articleAuthor: "Dave Wood",
        }
    }, {
        path: "reduced-to-ashes-and-rubbage",
        details: {
            articleTitle: "Reduced to rubble",
            articleAuthor: "Jack Jones",
        }
    }, {
        path: "diary-for-2018",
        details: {
            articleTitle: "Diary for 1998",
            articleAuthor: "Alan Johnson",
        }
    }
]

поэтому я хочу, чтобы результат был

var newArr1 = [{
    path: "don-t-call-me",
    details: {
        articleTitle: "Don’t call me",
        articleAuthor: "Dave Wood",
    }
},
{
    path: "diary",
    details: {
        articleTitle: "Diary",
        articleAuthor: "Alan Johnson",
    }
}
}]

var newArr2 = [
    {
        path: "dont-call-me",
        details: {
            articleTitle: "Don’t call me"
            articleAuthor: "Dave Wood",
        }
    }, {
        path: "diary-for-2018",
        details: {
            articleTitle: "Diary for 1998",
            articleAuthor: "Alan Johnson",
        }
    }
]

в настоящее время я создаю набор из каждого массива только из объекта подробностей из каждого элемента в каждом массиве

var set3 = new Set(result3.map(({ details }) => details));
var set4 = new Set(result4.map(({ details }) => details));

Затем создайте новый массив, используя set.has ()

var newArr1 = result3.filter(({ articleAuthor }) => set4.has(articleAuthor));
var newArr2 = result4.filter(({ articleAuthor }) => set3.has(articleAuthor));

Вывод для newArr2 корректен, но newArr1 пуст

1 Ответ

4 голосов
/ 30 апреля 2019

Вам нужна более глубокая деструкция для автора,

{ details: { articleAuthor } = {} }

потому что если нет, вы бы взяли объект detail за Set, и это значение в каждом литерале объекта уникально. И вы не получите articleAuthor.

var result4 = [{ path: "don-t-call-me", details: { articleTitle: "Don’t call me", articleAuthor: "Dave Wood" } }, { path: "diary", details: { articleTitle: "Diary", articleAuthor: "Alan Johnson" } }],
    result3 = [{ path: "letters", letters: 7 }, { path: "dont-call-me", details: { articleTitle: "Don’t call me", articleAuthor: "Dave Wood" } }, { path: "reduced-to-ashes-and-rubbage", details: { articleTitle: "Reduced to rubble", articleAuthor: "Jack Jones" } }, { path: "diary-for-2018", details: { articleTitle: "Diary for 1998", articleAuthor: "Alan Johnson" } }],
    set3 = new Set(result3.map(({ details: { articleAuthor } = {} }) => articleAuthor)),
    set4 = new Set(result4.map(({ details: { articleAuthor } = {} }) => articleAuthor)),
    newArr1 = result3.filter(({ details: { articleAuthor } = {} }) => set4.has(articleAuthor)),
    newArr2 = result4.filter(({ details: { articleAuthor } = {} }) => set3.has(articleAuthor));

console.log(newArr1);
console.log(newArr2);
console.log([...set3]);
console.log([...set4]);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...