Присвоить круговой массив объекту

1

Я более свежую к java-скрипту. Я создал объект и пары ключевых значений. Вновь мне нужно добавить еще один ключ (цвет) со значением, которое должно быть из массива color[] (color[]). Если размер объекта больше, чем размер массива цветов, тогда значение для цветового ключа должно быть назначено начиная с начала цветового массива

var sumArray=[{"sum":1},{"sum":2},{"sum":3},{"sum":4},{"sum":5},{"sum":6}]
var color=["#FF0F00","#FF6600","#FF9E01"];


var combinedObj =sumArray.map(function(obj) {
    var me = Object.assign({}, obj);
      var i=0;    
      me.color = color[i++];
    return me;
});

Выход

[{"sum":1,"color":"#FF0F00"},{"sum":2,"color":"#FF0F00"},
{"sum":3,"color":"#FF0F00"},{"sum":4,"color":"#FF0F00"},
{"sum":5,"color":"#FF0F00"},{"sum":6,"color":"#FF0F00"}]

Ожидаемый результат

[{"sum":1,"color":"#FF0F00"},{"sum":2,"color":"#FF6600"},
{"sum":3,"color":"#FF9E01"},{"sum":4,"color":"#FF0F00"},
{"sum":5,"color":"#FF6600"},{"sum":6,"color":"#FF9E01"}]

Значение изменяется с самого начала, если размер объекта больше, чем размер массива.

Я попытался изо всех сил, обратившись. Но не удалось. заранее спасибо

Теги:
arrays

3 ответа

0
Лучший ответ

Ваша проблема в этой строке:

var i=0;   

выведите его из цикла, и в цикле приращение должно быть:

 i = (i + 1) % color.length;

var sumArray=[{"sum":1},{"sum":2},{"sum":3},{"sum":4},{"sum":5},{"sum":6}]
var color=["#FF0F00","#FF6600","#FF9E01"];


var i=0;
var combinedObj = sumArray.map(function(obj) {
    var me = Object.assign({}, obj);
    me.color = color[i];
    i = (i + 1) % color.length;
    return me;
});
console.log(combinedObj);

Другой подход, исключающий глобальные переменные, может основываться на втором параметре карты:

var sumArray=[{"sum":1},{"sum":2},{"sum":3},{"sum":4},{"sum":5},{"sum":6}]
var color=["#FF0F00","#FF6600","#FF9E01"];


var combinedObj = sumArray.map(function(obj, idx) {
    var me = Object.assign({}, obj);
    me.color = color[idx % color.length];
    return me;
});
console.log(combinedObj);
2

Вы хотите определить итератор вне цикла и сбросить его до нуля, когда он достигнет наименьшей длины массивов

var sumArray = [{"sum": 1}, {"sum": 2}, {"sum": 3}, {"sum": 4}, {"sum": 5}, {"sum": 6}]
var color    = ["#FF0F00", "#FF6600", "#FF9E01"];

var i = 0;

var combinedObj = sumArray.map(function(obj) {
  var me = Object.assign({}, obj);
  i = i === color.length ? 0 : i;
  me.color = color[i++];
  return me;
});

console.log( JSON.stringify( combinedObj, 0, 4 ) )

Вы могли бы просто уменьшить массив

var sumArray = [{"sum":1},{"sum":2},{"sum":3},{"sum":4},{"sum":5},{"sum":6}]
var color    = ["#FF0F00","#FF6600","#FF9E01"];

var combinedObj = sumArray.reduce( (a,b,i) => 
  (a.push(Object.assign({}, b, {color:color[i%color.length]})), a)
, []);

console.log( JSON.stringify(combinedObj, 0, 4) )
0

Просто проверьте, является ли значение i равным 3, затем назначьте его 0

var sumArray = [{
  "sum": 1
}, {
  "sum": 2
}, {
  "sum": 3
}, {
  "sum": 4
}, {
  "sum": 5
}, {
  "sum": 6
}]
var color = ["#FF0F00", "#FF6600", "#FF9E01"];

var i = 0;
var combinedObj = sumArray.map(function(obj) {

  obj.color = color[i];
  i++;
  if (i === 3) {
    i = 0;
  }
  return obj

}, {});
console.log(combinedObj)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню