#javascript #arrays #sorting
#javascript #массивы #сортировка
Вопрос:
У меня есть следующий массив объектов:
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"}]
Комментарии:
1. Каков ожидаемый результат?
2. Вы можете отсортировать второй массив, найдя позицию элемента в первом массиве по Name == title и сравнив позиции в методе сортировки
Ответ №1:
Вы можете использовать встроенный метод сортировки и использовать 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:
Вместо сортировки 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 }) );
Ответ №3:
Вы могли бы взять a 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; }
Ответ №4:
Просто создайте новый массив arr2 из arr1..
arr2 = arr1.map((result) => ({Name: result.chart.title}));
Спасибо.
Комментарии:
1. почему отмечен негатив? приведенный ниже ответ такой же, как и у меня
Ответ №5:
Попробуйте следующее решение
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);