как отфильтровать объект значения ключа по подстроке значения - PullRequest
0 голосов
/ 25 декабря 2018

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

"list": [
        {
            "dt": 1545760800,
            "dt_txt": "2018-12-25 18:00:00"
        },
        {
            "dt": 1545771600,
            "dt_txt": "2018-12-25 21:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 00:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 03:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 04:00:00"
        }
       ]

Как отфильтровать этот массив объектов, чтобы получить только один объект для каждых данных.dt_txt

"list": [
        {
            "dt": 1545760800,
            "dt_txt": "2018-12-25 18:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 00:00:00"
        }
       ]

Как это получить?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

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

Вы можете просто сохранить set видимых значений и отфильтровать на основе этого.Если вы найдете новое значение, добавьте его в набор:

let list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]

let seen = new Set()
let filtered = list.filter(item => {
    let [date, _] = item.dt_txt.split(' ')
    return seen.has(date) ?  false : seen.add(date)
})

console.log(filtered)
0 голосов
/ 25 декабря 2018

Вы можете использовать reduce по-разному:

1] В массиве accumulator проверьте, существует ли объект с такой же датой, как у dt_txt.Если да, пропустите элемент, иначе добавьте элемент в accumulator

const list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]

const filter1 = list.reduce((acc, i) => (
  acc.find(a => new Date(a.dt_txt).toDateString() === new Date(i.dt_txt).toDateString())
  ? '' 
  : acc.push(i), acc), 
[]);

console.log(filter1);

2] Во втором подходе создается отдельная функция compareDates для сравнения дат и возврата boolean.Я использую toDateString () для сравнения дат

const list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]

// create a seperate function to compare the dates a return a boolean
const compareDates = (d1, d2) => new Date(d1).toDateString() === new Date(d2).toDateString();

const filter2 = list.reduce((acc, i) => (
  acc.find(a => compareDates(a.dt_txt, i.dt_txt)) ? '' : acc.push(i), acc)
,[])

console.log(filter2);

3] В третьем подходе целью является создание объекта с уникальными значениями даты в качестве ключа.Для каждого элемента в исходном массиве проверьте, существует ли эта дата в качестве ключа в accumulator.Если да, пропустите текущий элемент в контексте, иначе добавьте текущий элемент в качестве его значения.В конце у вас есть пара ключ-значение различных объектов в оригинальном массиве.Итак, просто получите значения, используя Object.values

const list =[{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}];

// gets only the date part in string 
const getDateString = (date) => new Date(date).toDateString();

const filter3 = Object.values(
      list.reduce((acc, i) => 
        (acc[getDateString(i.dt_txt)] = acc[getDateString(i.dt_txt)] || i, acc),{}))
        
console.log(filter3);
...