Array.filter возвращает пустой массив - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь получить сведения об ошибке на основе даты. Для этого я применяю array.filter, но он возвращает пустой массив.

Ниже мой массив:

value:[{
  "Date": "02/04/2019",
  "Total": "1000",
  "Success": "850",
  "Failure": "150",
  "FailureDeatils": [{
      "Reason": "Reason1",
      "Count": 2
    },
    {
      "Reason": "Reason2",
      "Count": 6
    }
  ]
}, {
  "Date": "03/04/2019",
  "Total": "800",
  "Success": "750",
  "Failure": "150",
  "FailureDeatils": [{
    "Reason": "Reason1",
    "Count": 3
  }, {
    "Reason": "Reason2",
    "Count": 1
  }]
}]      

И если я предоставлю дату как 02/04/2019, она должна вернуть следующее:

{
  "FailureDeatils": [{
      "Reason": "Reason1",
      "Count": 2
    },
    {
      "Reason": "Reason2",
      "Count": 6
    }
  ]
}

Я использую ниже метод array.filter:

var filtered = value.filter(isPresent);
function isPresent(value) {
  return value == 02/04/2019;
}

это возвращает пустой массив.

Может кто-нибудь, пожалуйста, понять меня, где я иду не так?

Ответы [ 7 ]

1 голос
/ 24 апреля 2019

Вам нужно проверить value.Date, а не value, потому что value или параметр обратного вызова будет содержать весь повторный object из вашего array:

function isPresent(value) {
  return value.Date && value.Date == "02/04/2019";
}

Чтобы получить толькоFailureDeatils из вашего отфильтрованного object, вы можете отобразить отфильтрованный результат с помощью Array#map() метода :

var filtered = data.filter(isPresent).map(o => { return {"FailureDeatils": o.FailureDeatils}});

Примечание:

  • Обязательно оберните "02/04/2019" между "", чтобы его можно было оценить как string и правильно сравнить, иначе он будет рассчитан и обработан как Number и даст неправильные результаты фильтрации,
  • Избегайте использования одного и того же имени переменной value дважды для вашего массива и для параметра обратного вызова для лучшей читаемости вашего кода.

Демонстрация:

var data = [{
  "Date": "02/04/2019",
  "Total": "1000",
  "Success": "850",
  "Failure": "150",
  "FailureDeatils": [{
      "Reason": "Reason1",
      "Count": 2
    },
    {
      "Reason": "Reason2",
      "Count": 6
    }
  ]
}, {
  "Date": "03/04/2019",
  "Total": "800",
  "Success": "750",
  "Failure": "150",
  "FailureDeatils": [{
    "Reason": "Reason1",
    "Count": 3
  }, {
    "Reason": "Reason2",
    "Count": 1
  }]
}]



var filtered = data.filter(isPresent).map(e => { return {"FailureDeatils": e.FailureDeatils}});

function isPresent(value) {
  return value.Date && value.Date == "02/04/2019";
}

console.log(filtered);
1 голос
/ 24 апреля 2019

Вот рабочий код, основанный на вашем массиве.

var value = [{
  "Date": "02/04/2019",
  "Total": "1000",
  "Success": "850",
  "Failure": "150",
  "FailureDeatils": [{
      "Reason": "Reason1",
      "Count": 2
    },
    {
      "Reason": "Reason2",
      "Count": 6
    }
  ]
}, {
  "Date": "03/04/2019",
  "Total": "800",
  "Success": "750",
  "Failure": "150",
  "FailureDeatils": [{
    "Reason": "Reason1",
    "Count": 3
  }, {
    "Reason": "Reason2",
    "Count": 1
  }]
}];

var filtered = value.filter (isPresent).map (obj => obj.FailureDeatils);;
function isPresent (value) {
  return value.Date == "02/04/2019";
}

console.log (filtered);
1 голос
/ 24 апреля 2019

В вашей функции isPresent, value - это каждый объект в массиве

И вы сравниваете весь объект со значением

Что вам нужно сделать, это сравнить свойство объекта этого объекта

function isPresent(value) {
    return value.Date == "02/04/2019";
}
0 голосов
/ 24 апреля 2019

Вы можете сделать:

const value = [{"Date": "02/04/2019","Total": "1000","Success": "850","Failure": "150","FailureDeatils":[{"Reason":"Reason1","Count":2}, {"Reason":"Reason2","Count":6}]},{"Date": "03/04/2019","Total": "800","Success": "750","Failure": "150","FailureDeatils": [{"Reason":"Reason1","Count":3},{"Reason":"Reason2","Count":1}]}];
const isPresent = ({Date}) => Date === '02/04/2019';
const filtered = value.filter(isPresent);

console.log(filtered);
0 голосов
/ 24 апреля 2019

const value = [{
      "Date": "02/04/2019",
      "Total": "1000",
      "Success": "850",
      "Failure": "150",
      "FailureDeatils": [{
          "Reason": "Reason1",
          "Count": 2
        },
        {
          "Reason": "Reason2",
          "Count": 6
        }
      ]
    }, {
      "Date": "03/04/2019",
      "Total": "800",
      "Success": "750",
      "Failure": "150",
      "FailureDeatils": [{
        "Reason": "Reason1",
        "Count": 3
      }, {
        "Reason": "Reason2",
        "Count": 1
      }]
    }]   

    var filtered = value.filter(isPresent).map(row => {
      return {
        FailureDeatils : row.FailureDeatils
      }
    });
    function isPresent(value) {
      return value.Date === "02/04/2019";
    }

    console.log(filtered)
0 голосов
/ 24 апреля 2019

Вы должны сделать так -

const value = [{
  "Date": "02/04/2019",
  "Total": "1000",
  "Success": "850",
  "Failure": "150",
  "FailureDeatils": [{
      "Reason": "Reason1",
      "Count": 2
    },
    {
      "Reason": "Reason2",
      "Count": 6
    }
  ]
}, {
  "Date": "03/04/2019",
  "Total": "800",
  "Success": "750",
  "Failure": "150",
  "FailureDeatils": [{
    "Reason": "Reason1",
    "Count": 3
  }, {
    "Reason": "Reason2",
    "Count": 1
  }]
}]

const filtered = value.filter((x) => x.Date === "02/04/2019");
0 голосов
/ 24 апреля 2019
var filtered = value.filter(function(a){
                   return a.Date === "02/04/2019";
               });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...