Выберите определенные элементы из объекта в javascript

#javascript #arrays #json #object #oop

Вопрос:

У меня есть этот объект, содержащий информацию о фотографиях, включая сведения об их обрезке.

 {
  "images": [
    {
      "key": "ASDV1-01.jpg",
      "image_location": "image1.jpg",
      "data": {
        "documentid": "CE44DBAC-59B2-4178-8392-0141FB2F58DF",
        "scandate": "Feb  1 2018 12:05PM",
        "F08": "1",
        "F09": "",
        "F10": "101076",
        "F11": ""
      },
      "crops": {
        "F08": {
          "rectangle": {
            "left": 690,
            "top": 2111,
            "width": 597,
            "height": 121
          }
        },
        "F09": {},
        "F10": {
          "rectangle": {
            "left": 653,
            "top": 821,
            "width": 653,
            "height": 243
          }
        },
        "F11": {}
      }
    },
    {
      "key": "ASDV1-01.jpg",
      "image_location": "image.png",
      "crops": {
        "F05": {
          "rectangle": {
            "left": 0,
            "top": 808,
            "width": 624,
            "height": 243
          }
        }
      },
      "metadata": [
        {
          "name": "colors",
          "data": {
            "dimensions": {
              "width": 2000,
              "height": 2600
            },
            "coordinates": {
              "width": {
                "x": {
                  "lat": 4,
                  "long": [12, 345]
                },
                "y": {
                  "lat": {
                    "x" : [12,345],
                    "y": "234"
                  },
                  "long": 123
                }
              }
            }
          }
        }
      ]
    },
    {
      "key": "ASDV1-02.jpg",
      "image_location": "image.png"
    }
  ]
}
 

И я хочу вернуть следующий вывод:

 "F02":
                    {
                        "left": 690,
                        "top": 2111,
                        "width": 597,
                        "height": 121
                    }
 

Точнее, я хочу вернуть новый объект, содержащий все объекты культур в этом объекте. Или новый массив, что бы это ни было. Попытался сделать это с помощью метода фильтра, но это было бесполезно. Заранее спасибо.

Комментарии:

1. F02 В исходном объекте его нет.

2. obj.images.map(image => image.crops)

Ответ №1:

Метод Array filter() создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

Если у объекта нет crops свойства, использование фильтра исключит элемент из массива.

Если вы хотите включить объекты без crops , метод map() может быть лучшим вариантом.

Если вы действительно хотите захватить определенный ключ, вы можете использовать вариант функции findKey, определенной ниже.

 var obj = {
  "images": [
    {
      "key": "ASDV1-01.jpg",
      "image_location": "image1.jpg",
      "data": {
        "documentid": "CE44DBAC-59B2-4178-8392-0141FB2F58DF",
        "scandate": "Feb  1 2018 12:05PM",
        "F08": "1",
        "F09": "",
        "F10": "101076",
        "F11": ""
      },
      "crops": {
        "F08": {
          "rectangle": {
            "left": 690,
            "top": 2111,
            "width": 597,
            "height": 121
          }
        },
        "F09": {},
        "F10": {
          "rectangle": {
            "left": 653,
            "top": 821,
            "width": 653,
            "height": 243
          }
        },
        "F11": {}
      }
    },
    {
      "key": "ASDV1-01.jpg",
      "image_location": "image.png",
      "crops": {
        "F05": {
          "rectangle": {
            "left": 0,
            "top": 808,
            "width": 624,
            "height": 243
          }
        }
      },
      "metadata": [
        {
          "name": "colors",
          "data": {
            "dimensions": {
              "width": 2000,
              "height": 2600
            },
            "coordinates": {
              "width": {
                "x": {
                  "lat": 4,
                  "long": [12, 345]
                },
                "y": {
                  "lat": {
                    "x" : [12,345],
                    "y": "234"
                  },
                  "long": 123
                }
              }
            }
          }
        }
      ]
    },
    {
      "key": "ASDV1-02.jpg",
      "image_location": "image.png"
    }
  ]
};


obj.images.filter(image => image.crops);
/***
returns an array with crops if they exist.

[
    {
        "key": "ASDV1-01.jpg",
        "image_location": "image1.jpg",
        "data": {
            "documentid": "CE44DBAC-59B2-4178-8392-0141FB2F58DF",
            "scandate": "Feb  1 2018 12:05PM",
            "F08": "1",
            "F09": "",
            "F10": "101076",
            "F11": ""
        },
        "crops": {
            "F08": {
                "rectangle": {
                    "left": 690,
                    "top": 2111,
                    "width": 597,
                    "height": 121
                }
            },
            "F09": {},
            "F10": {
                "rectangle": {
                    "left": 653,
                    "top": 821,
                    "width": 653,
                    "height": 243
                }
            },
            "F11": {}
        }
    },
    {
        "key": "ASDV1-01.jpg",
        "image_location": "image.png",
        "crops": {
            "F05": {
                "rectangle": {
                    "left": 0,
                    "top": 808,
                    "width": 624,
                    "height": 243
                }
            }
        },
        "metadata": [
            {
                "name": "colors",
                "data": {
                    "dimensions": {
                        "width": 2000,
                        "height": 2600
                    },
                    "coordinates": {
                        "width": {
                            "x": {
                                "lat": 4,
                                "long": [
                                    12,
                                    345
                                ]
                            },
                            "y": {
                                "lat": {
                                    "x": [
                                        12,
                                        345
                                    ],
                                    "y": "234"
                                },
                                "long": 123
                            }
                        }
                    }
                }
            }
        ]
    }
]
*/

function findKey(group, key) {
return group.images
    .filter(item => item.crops)
    .filter(item => item.crops[key])
    .map(item => item.crops[key])
    .reduce((a,b) => Object.assign(a,b), {});
}