Лучший способ динамически добавлять элементы из массива в объект как новые значения - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь добиться чего-то вроде этого:

let obj = [
    {"id": "1"},
    {"id": "2"},
    {"id": "3"}
]
const arr = ["a", "b", "c"];

obj = addAtoO(arr, obj); // expected outcome: obj = [{"id": "1", "text": "a"}, {"id": "2", "text": "b"}, {}]

Словами: динамически добавлять значения из массива к объекту как новые значения.

Вот что я пытаюсь:

const addAtoO = (a, o) => {
    o.map((i) => {
        console.log(Object.keys(i));
        // a.forEach((e) => {
        //     console.log(e);
        // });
        i['text'] = 'something'; // just add text for testing
    });
    return o;
};

obj = addAtoO(arr, obj);
console.log('result:');
console.log(obj);

Но похоже, что должен быть лучший путь.

Большое спасибо, ребята.Все ваши решения верны.Я должен был отметить один, поэтому я выбрал тот, который ближе всего к этому конкретному вопросу.

Ответы [ 5 ]

0 голосов
/ 28 ноября 2018

Нет необходимости усложнять ситуацию.Просто используйте forEach.

let obj = [{
    "id": "1"
  },
  {
    "id": "2"
  },
  {
    "id": "3"
  }
]
const arr = ["a", "b", "c"];

obj.forEach((object, index) => {
  object.text = arr[index]
})

console.log(obj)
0 голосов
/ 28 ноября 2018

То, как вы используете addAtoO, говорит о том, что вам не нужно изменять исходные объекты.Если это так, то простой forEach будет делать:

const addAtoO = (arr, obj) => arr.forEach((t, i) => obj[i].text = t);

addToO изменяет исходный массив объектов obj, поэтому он ничего не возвращает.

Пример:

const addAtoO = (arr, obj) => arr.forEach((t, i) => obj[i].text = t);

let obj = [ {"id": "1"}, {"id": "2"}, {"id": "3"}];
const arr = ["a", "b", "c"];

addAtoO(arr, obj);

console.log(obj);
0 голосов
/ 28 ноября 2018

Вы можете использовать map, как вы используете, и использовать его индекс, чтобы получить значение из массива arr и создать новый объект со значениями из obj & arr

let obj = [{
    "id": "1"
  },
  {
    "id": "2"
  },
  {
    "id": "3"
  }
]
const arr = ["a", "b", "c"];

let output = obj.map(function(item, index) {
  return Object.assign({}, item, {
    text: arr[index]
  })

})

console.log(output)

В противном случае вы также можете использовать forEach и изменять исходный массив obj

let obj = [{
    "id": "1"
  },
  {
    "id": "2"
  },
  {
    "id": "3"
  }
]
const arr = ["a", "b", "c"];

obj.forEach(function(item, index) {
  item.text = arr[index]

})

console.log(obj)
0 голосов
/ 28 ноября 2018

Для большей гибкости, я предлагаю использовать клавишу для функции, а также параметр.

const addTo = (objects, values, key) =>
        objects.map((o, i) => Object.assign({}, o, { [key]: values[i] }));

console.log(addTo([{ id: "1" }, { id: "2" }, { id: "3" }], ["a", "b", "c"], 'text'));

Если вы хотите изменить данные объекты, просто удалите пустой объект из Object.assign.

const addTo = (objects, values, key) =>
        objects.map((o, i) => Object.assign(o, { [key]: values[i] }));

var objects = [{ id: "1" }, { id: "2" }, { id: "3" }];

addTo(objects, ["a", "b", "c"], 'text');
console.log(objects);
0 голосов
/ 28 ноября 2018

Вы можете использовать .map() так:

const arr1 = [
  {"id": "1"},
  {"id": "2"},
  {"id": "3"}
]
const arr2 = ["a", "b", "c"];

const merge = (a1, a2) => a1.map((o, i) => Object.assign({}, o, {text: a2[i]}));

console.log(merge(arr1, arr2));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...