Как добавить новое свойство в подмассивы? - PullRequest
0 голосов
/ 31 января 2020

У меня есть массив с подмассивами, я пытаюсь добавить новое свойство title к каждому подмассиву. У меня есть реализация, но вместо добавления заголовка к каждому подмассиву он помещает его в конец массива

[
  { nextEpisodeDate: null },
  {
    episode: 12,
    id: '28800/tokyo-ghoul-12',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/12/th_3.jpg'
  },
  {
    episode: 11,
    id: '28459/tokyo-ghoul-11',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/11/th_3.jpg'
  },
  {
    episode: 10,
    id: '28001/tokyo-ghoul-10',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/10/th_3.jpg'
  },
  {
    episode: 9,
    id: '27741/tokyo-ghoul-9',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/9/th_3.jpg'
  },
  {
    episode: 8,
    id: '27092/tokyo-ghoul-8',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/8/th_3.jpg'
  },
  {
    episode: 7,
    id: '26689/tokyo-ghoul-7',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/7/th_3.jpg'
  },
  {
    episode: 6,
    id: '26529/tokyo-ghoul-6',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/6/th_3.jpg'
  },
  {
    episode: 5,
    id: '26431/tokyo-ghoul-5',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/5/th_3.jpg'
  },
  {
    episode: 4,
    id: '26373/tokyo-ghoul-4',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/4/th_3.jpg'
  },
  {
    episode: 3,
    id: '26278/tokyo-ghoul-3',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/3/th_3.jpg'
  },
  {
    episode: 2,
    id: '26188/tokyo-ghoul-2',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/2/th_3.jpg'
  },
  {
    episode: 1,
    id: '26103/tokyo-ghoul-1',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/1/th_3.jpg'
  }
]

Я хочу добиться следующего

  {
    episode: 12,
    title: '......'
    id: '28800/tokyo-ghoul-12',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/12/th_3.jpg'
  },
  {
    episode: 11,
    title: '......'
    id: '28459/tokyo-ghoul-11',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/11/th_3.jpg'
  },

Реализация


 * @param  {Object} obj   The original object
 * @param  {String} key   The key for the item to add
 * @param  {Any}    value The value for the new key to add
 * @param  {Number} index The position in the object to add the new key/value pair [optional]
var addToObject = function (obj, key, value, index) {
    // Create a temp object and index variable
    var temp = {};
    var i = 0;
    // Loop through the original object
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            // If the indexes match, add the new item
            if (i === index && key && value) {
                temp[key] = value;
            }
            // Add the current item in the loop to the temp obj
            temp[prop] = obj[prop];
            // Increase the count
            i++;
        }
    }
    // If no index, add to the end
    if (!index && key && value) {
        temp[key] = value;
    }
    return temp;
};

let list = addToObject(listByEps, 'title' , '....', 0)

Ответы [ 4 ]

1 голос
/ 31 января 2020

по ссылке:

listByEps.forEach(item => item.title = '......')

чистое назначение

let result = listByEps.map(item => {
  Object.assign({}, item, {title: '......'})
  return item;
});

только примеры

0 голосов
/ 31 января 2020

Решение, которое мне пришлось использовать, основывалось на объединении двух объектов путем манипулирования логиками c свойств.

const MergeRecursive = (obj1 , obj2) => {
  for(var p in obj2) {
    try{
      // Property in destination object set; update its value.
      if(obj2[p].constructor == Object){
        obj1[p] = MergeRecursive(obj1[p], obj2[p]);
      }else{
        obj1[p] = obj2[p];
      }
    }catch(e){
      // Property in destination object not set; create it and set its value.
      obj1[p] = obj2[p];
    }
  }
  return obj1;
}

module.exports = {
  MergeRecursive
}
  listByEps =  MergeRecursive(listByEps.slice(1) , chaptersTitles)
0 голосов
/ 31 января 2020

У меня есть временное решение, но оно присваивает один и тот же заголовок для всех подмассивов. Следует присвоить разные значения в свойстве title. Когда я делаю console.log (title), он показывает мне все заголовки

  let newListByEps;


    Array.from({length: chaptersTitles.length} , (v , k) =>{
      var title = chaptersTitles[k].title;
      console.log(title);

      // slice (1) to skip the subarray with the nextEpisodeDate property
      newListByEps =  listByEps.slice(1).map(item =>{
        Object.assign(item , {
          title: title
        })
        return item;
      })
    })

    console.log(newListByEps);
[
  { nextEpisodeDate: null },
  {
    episode: 12,
    id: '28800/tokyo-ghoul-12',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/12/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 11,
    id: '28459/tokyo-ghoul-11',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/11/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 10,
    id: '28001/tokyo-ghoul-10',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/10/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 9,
    id: '27741/tokyo-ghoul-9',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/9/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 8,
    id: '27092/tokyo-ghoul-8',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/8/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 7,
    id: '26689/tokyo-ghoul-7',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/7/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 6,
    id: '26529/tokyo-ghoul-6',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/6/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 5,
    id: '26431/tokyo-ghoul-5',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/5/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 4,
    id: '26373/tokyo-ghoul-4',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/4/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 3,
    id: '26278/tokyo-ghoul-3',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/3/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 2,
    id: '26188/tokyo-ghoul-2',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/2/th_3.jpg',
    title: 'Ghoul'
  },
  {
    episode: 1,
    id: '26103/tokyo-ghoul-1',
    imagePreview: 'https://cdn.animeflv.net/screenshots/1415/1/th_3.jpg',
    title: 'Ghoul'
  }
]

Переменная chaptersTitles содержит список заголовков, и я хочу передать его переменная newListByEps. Причина, по которой он показывает один и тот же заголовок для всего массива newListByEps, заключается в том, что каждый раз, когда он пробегает массив, он повторяет один и тот же список N раз. В этом случае повторите один и тот же arrat (chaptersTitles) 12 раз

Если кто-то может помочь мне решить проблему, я буду признателен. Видимо проблема в использовании Array.from ({});

Это список chaptersTitles.

[
  { episode: 1, title: 'Tragedy', date: '2014-07-04' },
  { episode: 2, title: 'Incubation', date: '2014-07-11' },
  { episode: 3, title: 'Dove', date: '2014-07-18' },
  { episode: 4, title: 'Supper', date: '2014-07-25' },
  { episode: 5, title: 'Scar', date: '2014-08-01' },
  { episode: 6, title: 'Cloudburst', date: '2014-08-08' },
  { episode: 7, title: 'Captivity', date: '2014-08-15' },
  { episode: 8, title: 'Circular', date: '2014-08-22' },
  { episode: 9, title: 'Birdcage', date: '2014-08-29' },
  { episode: 10, title: 'Aogiri', date: '2014-09-05' },
  { episode: 11, title: 'High Spirits', date: '2014-09-12' },
  { episode: 12, title: 'Ghoul', date: '2014-09-19' }
]
0 голосов
/ 31 января 2020

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

В котором Если первое, что нужно отметить, это то, что listByEps это не объект, это массив объектов. Попытка прочитать свойства этого не будет работать, поскольку у него нет ни одного, только проиндексированные элементы.

var addToObject = (array, key, value, index) => {
    if(index) {
        array[index][key] = value;
    } else {
        array.push({
            key: value
        })
    };
    return array;
}

Этот код нацелен на объект по указанному индексу в массиве listByEps и добавляет новую пару ключ / значение. Если индекса нет, он выталкивает новый объект в конец массива. Затем он возвращает весь массив с внесенными изменениями, потому что это то, что вы, кажется, хотите, чтобы он делал, когда вы называете его как let list = addPropertyToObj(listByEps, 'title' , '....', 0) в конце.

...