Lodash: создайте новый массив с последними элементами - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть массив, как показано ниже

[{
        "id": "001",
        "name": "A",
        "timestamp_created": "2019-02-27T11:22:19"
    },
    {
        "id": "002",
        "name": "A",
        "timestamp_created": "2019-02-27T11:30:19"
    },
    {
        "id": "003",
        "name": "B",
        "timestamp_created": "2019-02-27T10:15:19"
    },
    {
        "id": "004",
        "name": "B",
        "timestamp_created": "2019-02-27T11:05:19"
    }
]

Я хочу создать новый массив на основе указанного выше массива, но только с последним элементом (группа по имени элемента).

 [{
            "id": "002",
            "name": "A",
            "timestamp_created": "2019-02-27T11:30:19"
        },
        {
            "id": "004",
            "name": "B",
            "timestamp_created": "2019-02-27T11:05:19"
        }
    ]

Как объединить различные функции Lodash для достижения результата?

Любое предложение, пожалуйста, помогите мне.

Ответы [ 5 ]

0 голосов
/ 28 февраля 2019

Краткое решение с использованием lodash

const data = [...]
const result = _(data)
  .groupBy('name')
  .map(group => _.maxBy(group, 'timestamp_created'))
  .value()

Используйте groupBy для группировки по name .Затем используйте maxBy, чтобы получить объект, который имеет максимум timestamp_created .

_.maxBy(array, [iteratee=_.identity])

Этот метод похож на _.max за исключением того, что онпринимает iteratee, который вызывается для каждого элемента в массиве, чтобы сгенерировать критерий, по которому оценивается значение.Итерируемый вызывается с одним аргументом: (значение).

https://lodash.com/docs/4.17.11#maxBy

0 голосов
/ 27 февраля 2019

Отличные ответы до сих пор.Как ОП попросил решение Lodash, вот что:

const data = [{
    "id": "001",
    "name": "A",
    "timestamp_created": "2019-02-27T11:22:19"
},
{
    "id": "002",
    "name": "A",
    "timestamp_created": "2019-02-27T11:30:19"
},
{
    "id": "003",
    "name": "B",
    "timestamp_created": "2019-02-27T10:15:19"
},
{
    "id": "004",
    "name": "B",
    "timestamp_created": "2019-02-27T11:05:19"
}
];

const reduceFunction = (acc, val) => {
    if (val.name in acc) {
        if (val.timestamp_created > acc[val.name].timestamp_created) {
            acc[val.name] = val
        }
    } else {
        acc[val.name] = val
    }

    return acc;
};

const filteredData = _.values(
    _.reduce(data, reduceFunction, {})
);
0 голосов
/ 27 февраля 2019

Не используя библиотеку lodash, вы можете сгенерировать результат, используя Array.reduce () :

const input = [
    {
        "id": "001",
        "name": "A",
        "timestamp_created": "2019-02-27T11:22:19"
    },
    {
        "id": "002",
        "name": "A",
        "timestamp_created": "2019-02-27T11:30:19"
    },
    {
        "id": "003",
        "name": "B",
        "timestamp_created": "2019-02-27T10:15:19"
    },
    {
        "id": "004",
        "name": "B",
        "timestamp_created": "2019-02-27T11:05:19"
    }
];

let res = input.reduce((acc, {id, name, timestamp_created}) =>
{
    acc[name] = acc[name] || {id, name, timestamp_created};
    
    if (acc[name].timestamp_created < timestamp_created)
        acc[name] = {id, name, timestamp_created};    

    return acc;
}, {});

console.log(Object.values(res));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0 голосов
/ 27 февраля 2019

Если вы хотите использовать lodash, это сделает работу.

function latestItems(original) {
    filtered = [];
    grouped = _.groupBy(original, "name");
    _.forEach(grouped, function (group) {
        newest = {
            "timestamp_created": "0"
        };
        _.forEach(group, function (item) {
            if (item.timestamp_created > newest.timestamp_created) {
                newest = item;
            }
        });
        filtered.push(newest);
    });

    return filtered;
}
0 голосов
/ 27 февраля 2019

Вы можете взять Map, собрать все последние элементы (отметив timestamp_created), сгруппированные по name и получить значения.

var data = [{ id: "002", name: "A", timestamp_created: "2019-02-27T11:30:19" }, { id: "003", name: "B", timestamp_created: "2019-02-27T10:15:19" }, { id: "004", name: "B", timestamp_created: "2019-02-27T11:05:19" }, { id: "001", name: "A", timestamp_created: "2019-02-27T11:22:19" }],
    result = Array.from(data
        .reduce(
            (m, o) => m.has(o.name) && m.get(o.name).timestamp_created > o.timestamp_created
               ? m
               : m.set(o.name, o),
            new Map
        )
        .values()
    );
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...