Как пройти через 2 массива объектов javascript и создать третий? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть два объекта. У obj2 есть тексты, а у obj1 есть 3 subIbjId. Как я могу добавить 'id' в obj2 на основе obj1? Например: obj1 имеет 2 subObjId в первом объекте (1001, 1002). Я хочу подсчитать количество subObjId, которое имеет obj1, итерировать через obj1 и добавить ключ и значение id для объекта obj2. Если у obj1 есть два subObjId, то добавьте id: 1 к первым двум записям obj2 и т. Д.

Я изучаю javascript и пытаюсь решить некоторые воображаемые проблемы. Любая помощь будет принята с благодарностью. Спасибо.

var obj1 = { [
	{
		id: 1,
		name: ‘apple’,
		subObjId: [ 1001, 1002]
		subObjs: [
			{
			subId: 1001
			subName: ‘ant’,
			},
			{
			subId: 1002
			subName: ‘ball’,
			}
		],
	},
	{
		{
		id: 2,
		name: ‘zebra’,
		subObjId: [ 1003]
		subObjs: [
			{
			subId: 1003
			subName: ‘cat’,
			}
		],
	},
]
}

var obj2 = { [
	{
		text: ‘i am a text’
	},
	{
		text: ‘i am some random characters’
	},
	{
		text: ‘i am some numbers’
	}
] }


to become

finalObject = { [
	{
		id: 1,
		text: ‘i am a text’
	},
	{
		id: 1,
		text: ‘i am some random characters’
	},
	{	
		id: 2,
		text: ‘i am some numbers’
	}
] }

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Попробуйте это !!

var obj1 =  [
	{
		id: 1,
		name: 'apple',
		subObjId: [ 1001, 1002]
	},
		{
		id: 2,
		name: 'zebra',
		subObjId: [ 1003]
	}
]

var obj2 =  [
	{
		text: 'i am a text'
	},
	{
		text: 'i am some random characters'
	},
	{
		text: ' am some numbers'
	}
] 

let index = 0;
let start = 0;
obj1.map(data1=>{
  index += data1.subObjId.length;
  for(var i=start;i<index;i++){
    obj2[i]['id'] = data1.id;
  }
  start = i;
})

console.log(obj2)
0 голосов
/ 15 октября 2019

Вы можете использовать

  1. Array#flatMap для извлечения массива всех subObjs элементов
    • также Array#mapтолько в собственность их родителей id.
  2. Выполните еще одну операцию отображения, которая копирует содержимое соответствующего объекта в obj2 и добавляет id.
    • Для удобства используется второй аргумент Array#map, который устанавливает контекст this внутри обратного вызова.

Также используется деструктурирование для компактности и расширенный синтаксис для изготовления копий:

var obj1 = [ { id: 1, name: 'apple', subObjId: [1001, 1002], subObjs: [ { subId: 1001, subName: 'ant' }, { subId: 1002, subName: 'ball' } ] }, { id: 2, name: 'zebra', subObjId: [1003], subObjs: [ { subId: 1003, subName: 'cat', } ], }, ];

var obj2 = [ { text: 'i am a text' }, { text: 'i am some random characters' }, { text: 'i am some numbers' } ];

var finalObject = obj1
  //1. flatMap into a single array
  .flatMap(({id, subObjs}) => subObjs
    .map(sub => ({id})) //take only the parent ID for each sub object
  )// result: [{id: 1}, {id: 1}, {id: 2}]
  .map(function({id}, index) {
    return { id, ...this[index] } //2. create a new object with the id and the content of a matching object from the other array
  }, obj2);// <- set the `this` context for the callback

console.log(finalObject);

Это также может быть выполнено как единая операция при преобразовании в плоскую форму путем установки контекста this для копии второго массива (чтобы избежать мутации obj2), затемудаление элементов с начала нового массива с помощью Array#shift:

var obj1 = [ { id: 1, name: 'apple', subObjId: [1001, 1002], subObjs: [ { subId: 1001, subName: 'ant' }, { subId: 1002, subName: 'ball' } ] }, { id: 2, name: 'zebra', subObjId: [1003], subObjs: [ { subId: 1003, subName: 'cat', } ], }, ];

var obj2 = [ { text: 'i am a text' }, { text: 'i am some random characters' }, { text: 'i am some numbers' } ];

var finalObject = obj1.flatMap(function({id, subObjs}) { 
    return subObjs.map(sub => ({ id, ...this.shift() }))
  }, [...obj2]);// <- copy obj2 as the `this` context

console.log(finalObject);
0 голосов
/ 15 октября 2019

Используйте этот фрагмент

var obj1 = [
  {
    id: 1,
    name: 'apple',
    subObjId: [1001, 1002],
    subObjs: [{
      subId: 1001,
      subName: 'ant',
    },
    {
      subId: 1002,
      subName: 'ball',
    }
    ],
  },

  {
    id: 2,
    name: 'zebra',
    subObjId: [1003],
    subObjs: [{
      subId: 1003,
      subName: 'cat',
    }],
  },
]


var obj2 = [
  {
    text: 'i am a text'
  },
  {
    text: 'i am some random characters'
  },
  {
    text: 'i am some numbers'
  }
]

var finalObject = obj1.map(function (value, index) {
  return {
    id: value.id,
    text: obj2[index].text
  }
})

console.log(finalObject)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...