Итерировать и преобразовывать объект в массив

Из базы данных я получаю:

"Data": [{
  "mainData": [{
    "_id": ObjectId("5ab63b22d012ea2bc0bb7e9b"),
    "date": "2018-03-24"
  }],
  "files": [
    {
      "_id": ObjectId("5ab63b22d012ea2bc0bb7e9d"),
      "filename": "file-1521892130284.png",
      "path": "uploads\\file-1521892130284.png"
    },
    {
      "_id": ObjectId("5ab63b22d012ea2bc0bb7e9c"),
      "filename": "file-1521892130285.png",
      "path": "uploads\\file-1521892130285.png"
    }
  ]
}]

но мне нужно преобразовать выше примерно так:

this.galleryImages = [
  {
    small: 'file-1521892130284.png'
  },
  {
    small: 'file-1521892130285.png'
  }
];

Как лучше всего повторить путь к некоторым файлам и нажать его точно так же, как объект изображения галереи требований? GalleryImages — ngx-галерея от Angular.


person andrzej    schedule 29.03.2018    source источник
comment
где вы берете числа 'assets/1-small.jpg', или это просто увеличенный индекс?   -  person Nina Scholz    schedule 29.03.2018
comment
Используйте магию. Это все, что я могу вам сказать из того, что вы здесь написали.   -  person Matus Dubrava    schedule 29.03.2018
comment
ваш ответ не соответствует требуемому output.   -  person Narendra Jadhav    schedule 29.03.2018
comment
Почему файлы png становятся jpg и с разными путями, или это не имеет значения и следует использовать исходный путь + имя файла? Если последнее, пожалуйста, отредактируйте вопрос и улучшите его.   -  person Peter B    schedule 29.03.2018
comment
Я изменил это. Теперь все в порядке, это было из примеров.   -  person andrzej    schedule 29.03.2018


Ответы (3)


Начните с анализа вашего JSON, используя var Data = JSON.parse(str);

Затем создайте новый объект var galleryImage = []; и выполните итерацию по массиву данных.

for(var i =0; i < Data.files.length; i++)
  galleryImages[i] = { small : Data.files[i].filename }
person Germain    schedule 29.03.2018
comment
Спасибо, это работает, но когда у меня есть несколько массивов с объектными файлами, это не работает. - person andrzej; 29.03.2018

Для массива всех имен файлов вам нужно перебрать Data и внутренний массив files. Затем создайте новые объекты и сопоставьте внутренний результат, уменьшив внешний массив.

Используемый метод:

function ObjectId(v) { return v; }

var $scope = { "Data": [{ "mainData": [{ "_id": ObjectId("5ab63b22d012ea2bc0bb7e9b"), "date": "2018-03-24" }], "files": [{ "_id": ObjectId("5ab63b22d012ea2bc0bb7e9d"), "filename": "file-1521892130284.png", "path": "uploads\\file-1521892130284.png" }, { "_id": ObjectId("5ab63b22d012ea2bc0bb7e9c"), "filename": "file-1521892130285.png", "path": "uploads\\file-1521892130285.png" }] }] },
    array = $scope.Data.reduce(
        (r, { files }) => r.concat(files.map(({ filename: short }) => ({ short }))),
        []
    );

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 29.03.2018

person    schedule
comment
Спасибо, это работает, но когда у меня есть несколько массивов с объектными файлами, я получил их в одном массиве. - person andrzej; 29.03.2018
comment
Затем просто пропустите выравнивание вложенного массива, чтобы сохранить его таким. Это нормально? - person vassiliskrikonis; 29.03.2018
comment
Когда я опускаю const flattened = allFiles.reduce( (prev, x) => prev.concat(x)) я получаю: (2) [{…}, {…}] 0:{small: undefined} 1:{small : не определено} длина: 2 - person andrzej; 29.03.2018
comment
Я обновил свой ответ, чтобы объяснить более простые функции. - person vassiliskrikonis; 30.03.2018