Как отфильтровать и пройти через вложенный ассоциативный объект в JavaScript? - PullRequest
0 голосов
/ 03 марта 2019

Итак, у меня всего три вложенных ассоциативных объекта / массива.Сначала были созданы Employee1 и employee2, а затем сотрудники, чтобы вложить два ассоциативных объекта.Затем я создал третий ассоциативный объект employee3 для вложения в объект employee.Сейчас я пытаюсь отфильтровать двумерный массив с помощью метода .filter (), чтобы отобразить только тех сотрудников, которые там работают в данный момент, что указано в массивах как ["isCurrent"] = true;но все, что я получаю в окне консоли, не определено.Почему это происходит и как мне это исправить?

var employee1 = [];
employee1["id"] = 33;
employee1["name"] = "Carey Shanks";
employee1["title"] = "Knife Maker";
employee1["department"] = "fabrication";
employee1["isCurrent"] = true;

var employee2 = [];
employee2["id"] = 34;
employee2["name"] = "Giles Newman";
employee2["title"] = "Lead Sales";
employee2["department"] = "Customer Service";
employee2["isCurrent"] = true;

var employees = [];
employees[0] = [];
employees[0]["id"] = 33;
employees[0]["name"] = "Carey Shanks";
employees[0]["title"] = "Knife Maker";
employees[0]["department"] = "fabrication";
employees[0]["isCurrent"] = true;

var employee3 = [];
employee3["id"] = 35;
employee3["name"] = "Tori G.";
employee3["title"] = "Product Demonstrator";
employee3["department"] = "Marketing";
employee3["isCurrent"] = false;

//MERING THE ARRAYS
employees.push(employee2);
employees.push(employee3);

//TESTING TO SEE IF IT POPULATED
//window.console.log(employees);

var i;
var currentEmployee = function (isCurrent) {
    var isCurrentEmployee = true;
    for (i in employees) {
        if (isCurrent !== true) {
            isCurrentEmployee = false;
            break;
        }
    }
    return isCurrentEmployee;
};
var isCompanyEmployee = employees.filter(currentEmployee);

window.console.log(isCompanyEmployee[i]);

1 Ответ

0 голосов
/ 03 марта 2019

Некоторые проблемы:

  • Массивы следует использовать только с числовыми признаками.Если вы хотите использовать произвольные строковые ключи, используйте вместо этого объект.
  • Первый аргумент для обратного вызова filter - это текущий элемент, который повторяется;ваш

    var currentEmployee = function (isCurrent) {
    

    определяет isCurrent в качестве первого аргумента, но это не свойство isCurrent.Если вы хотите немедленно извлечь свойство isCurrent из объекта, вместо этого деструктурируйте параметр, а затем просто верните его:

    var currentEmployee = function ({ isCurrent }) {
      return isCurrent;
    }
    

    Или, если вы не знакомы с деструктурой, этоэквивалент

    var currentEmployee = function (employee) {
      return employee.isCurrent;
    }
    
  • i не имеет значения вне функции currentEmployee - вместо этого запишите отфильтрованный массив:

    console.log(isCompanyEmployee);
    
  • Вы никогда не вставляете employee1 в массив.

var employee1 = {};
employee1["id"] = 33;
employee1["name"] = "Carey Shanks";
employee1["title"] = "Knife Maker";
employee1["department"] = "fabrication";
employee1["isCurrent"] = true;

var employee2 = {};
employee2["id"] = 34;
employee2["name"] = "Giles Newman";
employee2["title"] = "Lead Sales";
employee2["department"] = "Customer Service";
employee2["isCurrent"] = true;

var employees = [];
employees[0] = {};
employees[0]["id"] = 33;
employees[0]["name"] = "Carey Shanks";
employees[0]["title"] = "Knife Maker";
employees[0]["department"] = "fabrication";
employees[0]["isCurrent"] = true;

var employee3 = {};
employee3["id"] = 35;
employee3["name"] = "Tori G.";
employee3["title"] = "Product Demonstrator";
employee3["department"] = "Marketing";
employee3["isCurrent"] = false;

//MERING THE ARRAYS
employees.push(employee1);
employees.push(employee2);
employees.push(employee3);

//TESTING TO SEE IF IT POPULATED
//window.console.log(employees);

var i;
var currentEmployee = function ({ isCurrent }) {
    return isCurrent;
};
var currentEmployees = employees.filter(currentEmployee);

window.console.log(currentEmployees);
...