Как создать массив на основе двух массивов

#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]);
}
});