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

#javascript #arrays #date #object #filtering

#javascript #массивы #Дата #объект #фильтрация

Вопрос:

Я пытаюсь получить сведения о сбое на основе даты. Для этого я применяю 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;
}
  

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

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

Комментарии:

1. return value.Date == "02/04/2019"; может быть?

2. Что такое isPresent? пожалуйста, поделитесь условием, которое вы применяете, используя isPresent

3. присутствует не что иное, как функция, написанная ниже

4. Хорошо, я добавил ответ, основанный на вашем коде. Вы также можете протестировать его в консоли браузера, прежде чем внедрять в свой код.

5. Пожалуйста, поднимите вопрос, сработало ли это для вас. Спасибо!

Ответ №1:

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

 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);
  

Ответ №2:

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

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

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

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

Комментарии:

1. Спасибо!! Я могу получить все данные сейчас, но мне нужны только детали сбоя из этого

Ответ №3:

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

 function isPresent(value) {
  return value.Date amp;amp; 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 amp;amp; value.Date == "02/04/2019";
}

console.log(filtered);  

Ответ №4:

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

 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");
  

Ответ №5:

 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)  

Ответ №6:

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

 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);  

Ответ №7:

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

Комментарии:

1. 02/04/2019 будет вычислено здесь, смотрите результат console.log(02/04/2019)