#javascript #arrays #object
#javascript #массивы #объект
Вопрос:
У меня есть массив объектов, этот массив содержит разные имена.
[ "Foo", "Bar", "Test", "Other" ];
И другого массива object
[ { name:"Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 } ]
Мне нужно создать массив из них, новый массив содержит подмассив размером 2, первый индекс — имя, а второй индекс — значение.
Порядок массива должен быть таким же, как у первого (массив имен).
Нравится
[ ["Foo", 120], ["Bar", 159], ["Test", undefined], ["Other", 1230] ]
Итак, я пробую этот код, но мой вывод неверен. Порядок имен правильный, но порядок значений — нет.
var order = ["Foo", "Bar", "Test", "Other"];
var values = [{ name: "Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 }];
var array = order.map(function(name, i) {
return [name, (values[i] amp;amp; values[i].value) ];
})
console.log(array)
Ответ №1:
Вы могли бы взять Map
и получить элементы в нужном порядке.
var names = [ "Foo", "Bar", "Test", "Other" ],
objects = [{ name: "Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 }],
map = new Map(objects.map(({ name, value }) => [name, value])),
result = names.map(name => [name, map.get(name)])
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №2:
Вы почти на месте — вам просто нужно find
ввести правильное значение:
var order = ["Foo", "Bar", "Test", "Other"];
var values = [{ name: "Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 }];
var array = order.map(function(name, i) {
return [name, values.some(e => e.name == name) ? values.find(e => e.name == name).value : undefined];
})
console.log(array)
Синтаксис ES5:
var order = ["Foo", "Bar", "Test", "Other"];
var values = [{ name: "Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 }];
var array = order.map(function(name, i) {
return [name, values.some(function(e) {
return e.name == name;
}) ? values.find(function(e) {
return e.name == name;
}).value : undefined];
});
console.log(array)
Ответ №3:
Ознакомьтесь с моим решением. Надеюсь, это поможет.
const a = [ "Foo", "Bar", "Test", "Other" ];
const b = [ { name:"Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 } ];
const res = a.map((item) => [ item, (b.find(({ name }) => name === item) || {}).value ])
console.log(res)
Комментарии:
1. Обратите внимание, что это
name === item
вызываетсяlen(a) x len(b)
несколько раз — это может иметь значение, а может и не иметь, в зависимости от того, насколько они велики.
Ответ №4:
Вам нужно использовать записи в «порядке» для поиска «name» в значениях
var order = ["Foo", "Bar", "Test", "Other"];
var values = [{ name: "Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 }];
var array = order.map(function(key, i) {
let found = values.find(({name}) => name === key);
return [key, found amp;amp; found.value ];
})
console.log(array)
Ответ №5:
Вы могли бы использовать map и взять Object.значения найденного элемента или значения по умолчанию
const arr1 = [ "Foo", "Bar", "Test", "Other" ];
const arr2 = [ { name:"Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 } ];
const res = arr1.map(e => Object.values(arr2.find(({name}) => name === e) || ({name: e, value: undefined})));
console.log(res);
Ответ №6:
var order = ["Foo", "Bar", "Test", "Other"];
var values = [{ name: "Bar", value: 159 }, { name: "Foo", value: 120 }, { name: "Other", value: 1230 }];
var result = [];
orders.forEach((f) => {
let found = false;
values.forEach(s => {
if (f === s.name) {
result.push([f, s.value]);
found = true;
}
});
if (!found) {
result.push([f, undefined]);
}
});