У меня есть массив таких объектов (клиентов):
"{"client_id":"AAA1","contracts":[{"contract_id":"CON1-AAA1","revisions":[{"date":"2018-07-30","status":"First Sign"}]}]}"
Я могу без проблем фильтровать по client_id:
var query = clients.filter(x => x.client_id == "AAA1");
Однако я хотел бы выполнить фильтрацию по дате или статусу ревизии, я тестировал следующие действия, но получаю сообщение об ошибке «Uncaught TypeError: Cannot read property 'status' of undefined»
var query = clients.filter(x => x.contracts.revisions.status == "First Sign");
Возможно ли это сделать так или это бред? :)
@korocota, пожалуйста, предоставьте правильный JSON, если это так!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это происходит, поскольку ревизии и контракты представляют собой массив.
Вам нужно будет выбрать между любым предметом, равным всем предметам, равным.
Использование Array.prototype.some - любой элемент в массиве отвечает критерию. Использование Array.prototype.every - все элементы в массиве соответствуют критериям.
Пример поиска клиента, у которого есть контракт хотя бы на пересмотр со статусом «Первый знак»:
const query = clients.filter(x => x.contracts.some(c => c.revisions.some(r => r.status == "First Sign")));
contracts - тоже массив
x.contracts.revisions Но revisions не является свойством contracts, contracts - это массив
Ага, не заметил этого. Я исправил свой ответ.
Клиент - это объект с идентификатором и массивом контрактов, каждый контракт имеет идентификатор с массивом ревизий, каждая ревизия имеет дату и статус, если это имеет смысл
Вы можете добиться этого, используя комбинацию Array#filter и двух Array#some:
const clients = [{
"client_id": "AAA1",
"contracts": [{
"contract_id": "CON1-AAA1",
"revisions": [{
"date": "2018-07-30",
"status": "First Sign"
}]
}]
}, {
"client_id": "AAA2",
"contracts": [{
"contract_id": "CON1-AAA2",
"revisions": [{
"date": "2018-08-30",
"status": "Second Sign"
}]
}]
}];
let result = clients.filter(cl => cl.contracts.some(c => c.revisions.some(r => r.status == 'First Sign')));
console.info(result);OP, вероятно, хочет фильтровать clients, а не contracts
@Adelin Отредактировано ^^
@korocota ну, он не может принять голос, если вы его не дадите :) текущий +1 от меня :)
Используйте filter и some, как показано ниже:
var clients = [
{
"client_id": "AAA1",
"contracts": [
{
"contract_id": "CON1-AAA1",
"revisions": [
{
"date": "2018-07-30",
"status": "First Sign"
}]
}]
},
{
"client_id": "AAA1",
"contracts": [
{
"contract_id": "CON1-AAA1",
"revisions": [
{
"date": "2018-07-30",
"status": "Second Sign"
}]
}]
}]
var query = clients.filter(
x => x.contracts.some(y => y.revisions.some(z => z.status == "First Sign")));
console.info(query);Итак, поскольку ваше сообщение об ошибке и описание проблемы четко указывают, что то, что вы опубликовали в виде строки (которая выглядит как объект), действительно является выдержкой из большего массива, вы можете сделать следующее
const arr = [{"client_id":"AAA1","contracts":[{"contract_id":"CON1-AAA1","revisions":[{"date":"2018-07-30","status":"First Sign"}]}]}];
const res = arr.filter(client => client.contracts.some(contract => contract.revisions.some(revision => revision.status === 'First Sign')));
console.info(res);
"{"client_id":"AAA1","contracts":[{"contract_id":"CON1-AAA1","revisions":[{"date":"2018-07-30","status":"First Sign"}]}]}"- это не массив. Это строка. Пожалуйста, предоставьте минимальный воспроизводимый пример, используя кнопку<>