Как создать массив на основе двух массивов - PullRequest
2 голосов
/ 28 марта 2019

У меня есть массив объектов, этот массив содержит разные имена.

[ "Foo", "Bar", "Test", "Other" ];

И еще один массив объектов

[ { 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] && values[i].value) ];
})

console.log(array)

Ответы [ 6 ]

5 голосов
/ 28 марта 2019

Вы можете взять 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; }
5 голосов
/ 28 марта 2019

Вы почти у цели - вам просто нужно 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)
4 голосов
/ 28 марта 2019

Вам необходимо использовать записи в «порядке» для поиска «имени» в значениях

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 && found.value ];
})

console.log(array)
4 голосов
/ 28 марта 2019

Проверьте мое решение. Надеюсь, это поможет.

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)
3 голосов
/ 28 марта 2019

Вы можете использовать карту и взять Object.values ​​найденного элемента или значение по умолчанию

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);
1 голос
/ 28 марта 2019
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]);
}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...