Мой объект массива похож на приведенный ниже пример.
list = [
{'name': 'test1', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456416646}
{'name': 'test2', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456416111}
{'name': 'test3', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456412541}
{'name': 'test4', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456414521}
]
Я могу отсортировать этот объект массива вот так.
return conversationList.sort((a, b) => {
const firstTimestamp = a.lastMessage && a.lastMessage.createdAt ? a.lastMessage.createdAt : 0;
const secondTimestamp = b.lastMessage && b.lastMessage.createdAt ? b.lastMessage.createdAt : 0;
//Sort in DESC order
return secondTimestamp - firstTimestamp;
});
Используя приведенный выше код, я могу отсортировать массив объектов в порядке убывания.
Теперь мое требование - первый массив фильтров на основе испин ключ., если для ispin установлено значение true, тогда я хочу создать новый объект массива с ключом штырь также в порядке убывания и еще один массив с ключом недавний в порядке убывания.
Итак, мой окончательный результат должен быть таким.
{
// first array object with key pin : filter by ispin:true and order by descending order
pin: [
{'name': 'test1', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456416646}
{'name': 'test3', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456412541}
],
// second array object with ket recent : order by descending order and records which has ispin false
recent: [
{'name': 'test2', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456416111}
{'name': 'test4', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456414521}
]
}
@ T.J. Crowder: Я не думаю, что этот дубликат хороший. Я писал ответ, когда вы закрыли вопрос, который был связан с функцией groupBy (используя сокращение в качестве другого комментария). OP требует здесь группировка, а не фильтрацию, на этот вопрос может быть гораздо лучший ответ, чем для повторяющейся цели.
ах, да, я вижу в этом бессмыслицу (и просто понял это, глядя на свой ответ). Должен быть { pin: [{}] }
Чтобы разделить список в зависимости от значения isPin, вы можете выполнить группировку следующим образом:
list = [
{'name': 'test1', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456416646},
{'name': 'test2', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456416111},
{'name': 'test3', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456412541},
{'name': 'test4', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456414521},
]
const groupBy = (array, fn) => array.reduce((result, item) => {
const key = fn(item);
if (!result[key]) result[key] = [];
result[key].push(item);
return result;
}, {});
const result = groupBy(list, x => x.ispin ? 'pin' : 'recent');
console.info(result);
(примечание: groupBy вдохновлено https://www.reddit.com/r/javascript/comments/4yi7e4/split_an_array_into_2_arrays_based_on_conditions/), и, как сказал его автор, вы можете вместо этого использовать groupBy
из lodash, если вы используете эту библиотеку.
Я считаю, что вы можете добиться этого с помощью метода
.reduce()
. Вы можете создать новый массив, содержащий объекты сisPin:true
, а затем отсортировать этот массив, как вы делали ранее.