Сравнение двух JSON в NodeJs & Express - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь сравнить два файла JSON в NodeJs. Если есть отзыв, который соответствует идентификатору места, мне нужно выложить sh данные обзора в места JSON. Если нет подходящих отзывов, он выдвигает пустой массив.

Вот код:

// мест JSON

[{
        "id": 1,
        "title": "Hotel in Sidney",
        "maxNumberOfGuests": 5,
        "description": "Quiet place by the water.",
        "createdAt": "2019/12/7 14:34",
        "price": 120
    },
    {
        "id": 2,
        "title": "Cabin in Italy",
        "maxNumberOfGuests": 2,
        "description": "Romantic lake cabin for two.",
        "createdAt": "2019/4/7 10:00",
        "price": 250
    }
]

// Отзывы JSON

[{
        "id": 1,
        "numberOfStars": 3,
        "content": "Comfy place",
        "placeId": 1,
        "createdAt": 12345
    },
    {
        "id": 2,
        "numberOfStars": 4,
        "content": "Awesome lake view.",
        "placeId": "",
        "createdAt": 23456
    }
]

Вот желаемый результат:

[{
        "id": 1,
        "title": "Hotel in Sidney",
        "maxNumberOfGuests": 5,
        "description": "Quiet place by the water.",
        "createdAt": "2019/12/7 14:34",
        "reviews": [{
            "id": 1,
            "numberOfStars": 3,
            "content": "Comfy place",
            "placeId": 1,
            "createdAt": 12345
        }],
        "price": 120
    },
    {
        "id": 2,
        "title": "Cabin in Italy",
        "maxNumberOfGuests": 2,
        "description": "Romantic lake cabin for two.",
        "createdAt": "2019/4/7 10:00",
        "reviews": [],
        "price": 250
    }
]

вот как далеко я мог бы добраться:

places.forEach(p => {
  const { id } = p;
  console.log(id);
  return id;
});

reviews.forEach(r => {
  const { id, numberOfStars, content, placeId, createdAt } = r;
  // console.log(id, numberOfStars, content, placeId, createdAt);
  console.log(r);
  return r;
});

//node express routes to places where will display the desired result. 

router.get('/places', function(req, res) {
  res.json(places);
});

Я просто не могу заставить его работать и мне нужна помощь.

Спасибо за вперед.

Ответы [ 2 ]

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

попробуйте

let places =[{
        "id": 1,
        "title": "Hotel in Sidney",
        "maxNumberOfGuests": 5,
        "description": "Quiet place by the water.",
        "createdAt": "2019/12/7 14:34",
        "price": 120
    },
    {
        "id": 2,
        "title": "Cabin in Italy",
        "maxNumberOfGuests": 2,
        "description": "Romantic lake cabin for two.",
        "createdAt": "2019/4/7 10:00",
        "price": 250
    }
];

let reviews =[{
        "id": 1,
        "numberOfStars": 3,
        "content": "Comfy place",
        "placeId": 1,
        "createdAt": 12345
    },
    {
        "id": 2,
        "numberOfStars": 4,
        "content": "Awesome lake view.",
        "placeId": "",
        "createdAt": 23456
    }
];
places.forEach(function(place) {
  place.reviews = reviews.filter(review => review.placeId ===place.id);
});


console.log(places);
0 голосов
/ 18 января 2020

Я бы сначала уменьшил массив обзоров до объекта, обозначенного placeId.

const reviews = [{
    "id": 1,
    "numberOfStars": 3,
    "content": "Comfy place",
    "placeId": 1,
    "createdAt": 12345
  },
  {
    "id": 2,
    "numberOfStars": 4,
    "content": "Awesome lake view.",
    "placeId": "",
    "createdAt": 23456
  }
];

const reviewsHashmap = reviews.reduce((acc, review) => {
  if (!review.placeId) return acc;
  acc[review.placeId] = acc[review.placeId] || [];
  acc[review.placeId].push(review);
  return acc;
}, {})

Это делает его более производительным при добавлении свойства отзывов, поскольку теперь вам не нужно снова фильтровать массив отзывов и снова для каждого места.

const places = [
  {
    "id": 1,
    "title": "Hotel in Sidney",
    "maxNumberOfGuests": 5,
    "description": "Quiet place by the water.",
    "createdAt": "2019/12/7 14:34",
    "price": 120
  },
  {
    "id": 2,
    "title": "Cabin in Italy",
    "maxNumberOfGuests": 2,
    "description": "Romantic lake cabin for two.",
    "createdAt": "2019/4/7 10:00",
    "price": 250
  }
];

const placesWithReviews = places.map(place => ({
  ...place,
  reviews: reviewsHashmap[place.id] || []
}))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...