2 массива, разных размеров, повторно использовать один массив в цикле после достижения максимального индекса - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть 2 массива, структурированных примерно так, и я хочу перебрать больший массив и присвоить ему свойство, используя случайные идентификаторы из меньшего массива

//Actual array length is 140
const users = [
  {
    name: "John Roberts",
    uid: "49ikds_dm3idmssmmi9sz"
  },
  {
    name: "Peter Jones",
    uid: "fmi33_sm39imsz9z9nb"
  }
]

//Actual array lenth is 424
const cars = [
  {
    manufacturer: "BMW",
    model: "320d",
    year: "2010",
    user: null
  },
  {
    manufacturer: "BMW",
    model: "530d",
    year: "2018",
    user: null
  },
  {
    manufacturer: "AUDI",
    model: "RS6",
    year: "2014",
    user: null
  }
]

for(let i = 0; i < cars.length; i++){
  //if index is 2 or greater in this example. users[2] will be undefined
  cars[i].user = users[i].uid;
}

Я в основном хочу повторно использовать маленький users массив.В приведенном выше примере, когда переменная i равна 2 или больше, users[2] будет undefined.

Может кто-нибудь порекомендовать элегантное решение, которое поможет мне решить эту проблему .?

Ответы [ 5 ]

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

var users = [
	{
		name: "John Roberts",
		uid: "49ikds_dm3idmssmmi9sz"
	},
	{
		name: "Peter Jones",
		uid: "fmi33_sm39imsz9z9nb"
	}
]

//Actual array lenth is 424
var cars = [
	{
		manufacturer: "BMW",
		model: "320d",
		year: "2010",
		user: null
	},
	{
		manufacturer: "BMW",
		model: "530d",
		year: "2018",
		user: null
	},
	{
		manufacturer: "AUDI",
		model: "RS6",
		year: "2014",
		user: null
	}
]

cars.map(function(car){
	var randomIndex = Math.floor(Math.random() * Math.floor(users.length))
	car.user = users[randomIndex].uid;
})
console.log(cars)
0 голосов
/ 28 сентября 2018

Это очень просто.Просто напишите следующую логику.

$.grep(users, function(user, i ) {  cars[i].user = user.uid;});
0 голосов
/ 28 сентября 2018

Вы можете использовать %, чтобы всегда иметь правильный индекс и повторно использовать пользователей.

const users = [
  {
    name: 'John Roberts',
    uid: '49ikds_dm3idmssmmi9sz',
  },
  {
    name: 'Peter Jones',
    uid: 'fmi33_sm39imsz9z9nb',
  }
];

const cars = [
  {
    manufacturer: 'BMW',
    model: '320d',
    year: '2010',
    user: null,
  },
  {
    manufacturer: 'BMW',
    model: '530d',
    year: '2018',
    user: null,
  },
  {
    manufacturer: 'AUDI',
    model: 'RS6',
    year: '2014',
    user: null,
  },
];

for (let i = 0; i < cars.length; i += 1){
  cars[i].user = users[i % users.length].uid;
}

console.log(cars);

Решение ES6, в которое вы не поверите!(нажмите наживку)

const users = [
  {
    name: 'John Roberts',
    uid: '49ikds_dm3idmssmmi9sz',
  },
  {
    name: 'Peter Jones',
    uid: 'fmi33_sm39imsz9z9nb',
  }
];

const cars = [
  {
    manufacturer: 'BMW',
    model: '320d',
    year: '2010',
    user: null,
  },
  {
    manufacturer: 'BMW',
    model: '530d',
    year: '2018',
    user: null,
  },
  {
    manufacturer: 'AUDI',
    model: 'RS6',
    year: '2014',
    user: null,
  },
];

const ret = cars.map((x, xi) => ({
  ...x,
  
  user: users[xi % users.length].uid,
}));

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

вариант 1:

for(let i = 0; i < cars.length; i++){
   cars[i].user = users[i % users.length].uid;
}

вариант 2:

for(let i = 0; i < cars.length; i++){
   cars[i].user = users[Math.round(Math.random() * (users.length - 1))].uid;
}
0 голосов
/ 28 сентября 2018

Вам просто нужно протестировать user[i] var и указать значение по умолчанию:

for(let i = 0; i < cars.length; i++){
  //if index is 2 or greater in this example. users[2] will be undefined
  cars[i].user = users[i] && users[i].uid || /*Default value:*/ null;
}

Вы также можете сделать это с помощью простого, если:

for(let i = 0; i < cars.length; i++){
  //if index is 2 or greater in this example. users[2] will be undefined 
  if (users[i]) {
    cars[i].user = users[i].uid;
  } else {
    cars[i].user = null; // Or another default
  }
}

------------------ Обновление для учета комментариев -----------------

Если вы хотите зациклить пользователяи начать заново массив, когда вы закончите, вы можете использовать по модулю %

let user_idx = null
for(let i = 0; i < cars.length; i++){

  user_idx = i % users.length

  //if index is 2 or greater in this example. users[2] will be undefined
  cars[i].user = users[user_idx].uid || null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...