Сортировать массив на основе значений в другом массиве - Javascript - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть следующий массив объектов:

arr1 =  [{chart: {field: "test", title: "ABC", type: 0}}, {chart: {field: "test", title: "123", type: 1}}, {chart: {field: "test", title: "XYZ", type: 2}}]

arr2 =   [{Name: "XYZ"}, {Name: "ABC"}, {Name: "123"}]

Как мне отсортировать arr2 по значению заголовка arr1?

Желаемый результат будет:

[{Name: "ABC"}, {Name: "123"}, {Name: "XYZ"}]

Ответы [ 5 ]

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

Вы можете использовать встроенный метод сортировки и использовать findIndex(). И sort() основывается на этом индексе. Я использовал общую функцию func для получения индекса обоих аргументов сортировки.

const arr1 =  [{chart: {field: "test", title: "ABC", type: 0}}, {chart: {field: "test", title: "123", type: 1}}, {chart: {field: "test", title: "XYZ", type: 2}}]


const arr2 =   [{Name: "XYZ"}, {Name: "ABC"}, {Name: "123"}];

const func = a => arr1.findIndex(b => b.chart.title === a.Name);

const res = [...arr2].sort((a,b) => func(a) - func(b));

console.log(res)
2 голосов
/ 17 апреля 2019

Вместо сортировки arr2 присвойте ему новое значение на основе значений в arr1:

[{chart: {field: "test", title: "ABC", type: 0}}, {chart: {field: "test", title: "123", type: 1}}, {chart: {field: "test", title: "XYZ", type: 2}}].map(item => ({"Name" : item.chart.title }) );
1 голос
/ 17 апреля 2019

Вы можете взять Map для индексов.

var array1 = [{ chart: { field: "test", title: "ABC", type: 0 } }, { chart: { field: "test", title: "123", type: 1 } }, { chart: { field: "test", title: "XYZ", type: 2 } }],
    array2 = [{ Name: "XYZ" }, { Name: "ABC" }, { Name: "123" }],
    indices = new Map(array1.map(({ chart: { title }}, i) => [title, i]));

array2.sort(({ Name: a }, { Name: b }) => indices.get(a) - indices.get(b));

console.log(array2);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 17 апреля 2019

Попробуйте приведенное ниже решение

arr1 =  [{chart: {field: "test", title: "ABC", type: 0}}, {chart: {field: "test", title: "123", type: 1}}, {chart: {field: "test", title: "XYZ", type: 2}}]

arr2 =   [{Name: "XYZ"}, {Name: "ABC"}, {Name: "123"}]

var newArr = [];
arr1.filter(item=>{
  newArr.push(arr2.find(element => element.Name === item.chart.title));
});

console.log(newArr);
0 голосов
/ 17 апреля 2019

Просто создайте новый массив arr2 из arr1 ..

arr2 = arr1.map((result) => ({Name: result.chart.title}));

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...