2017-02-01 2 views
0

У меня есть объект и массивФильтр объекта, чтобы получить значения и в другом массиве

{ 
    "library_items": 
    [ 

    { 
     "id": "23493", 
     "artifactID": "", 
     "title":"Physics Lecture", 
     "authors": [{ 
        "name": "Don Johnson", 
        "artifactID": "", 
        "role": "author", 
        "roleID": "" 
        }], 
     "artifactType": "games", 
     "domain": { 
        "branch": "", 
        "description": "", 
        "branchInfo": { 
            "branch": "", 
            "subject": "Physics" 
           } 
        }, 
     "type": { 
       "description": "", 
       "id": "", 
       "name": "" 
     } 
    }, 


    { 
     "id": "23493", 
     "artifactID": "", 
     "title":"Chemistry Lecture", 
     "authors": [{ 
        "name": "Don Johnson", 
        "artifactID": "", 
        "role": "author", 
        "roleID": "" 
        }], 
     "artifactType": "games", 
     "domain": { 
        "branch": "", 
        "description": "", 
        "branchInfo": { 
            "branch": "", 
            "subject": "Chemistry" 
           } 
        }, 
     "type": { 
       "description": "", 
       "id": "", 
       "name": "" 
     } 
    } 
    ] 
    } 

У меня есть еще один массив

var subjects = ['Physics', 'Biology', 'Mathematics'] 

как отфильтровать объект с помощью значений массива в " предметы"?. Я имею в виду, что хочу получать предметы из объекта, у которого есть предмет, соответствующий любому из значений массива.

ответ

2

В основном, используя методы filter и indexOf.

  1. filter использование делает этот метод для фильтрации массива в соответствии с критериями соответствия, как они определенно в функции обратного вызова.
  2. indexOf Чтобы проверить, содержит ли массив значение.
    Примечание: Существует еще один метод includes, который может проверять наличие элемента в массиве, который является частью проекта ES7, но не поддерживается многими браузерами.

var items = { 
 
"library_items": 
 
    [ 
 
    { 
 
     "id": "23453", 
 
     "artifactID": "", 
 
     "title":"Physics Basics", 
 
     "subject": "Physics" 
 

 
    }, 
 
    { 
 
     "id": "23453", 
 
     "artifactID": "", 
 
     "title":"Chemistry Basics", 
 
     "subject": "Chemistry" 
 

 
    } 
 

 
    ] 
 
}; 
 
var subjects = ['Physics', 'Biology', 'Mathematics']; 
 
var filtered = items.library_items.filter((x) => subjects.indexOf(x.subject) > -1); 
 
console.log(filtered);

+0

Я редактировал код, и я создал вложенный объект ... сп я все еще использую вам метод выше, чтобы получить значение «субъекта» в домене> branchInfo? или как я могу его отрегулировать –

+0

Да, просто замените 'x.subject' на' x.domain.branchInfo.subject' – Agalo

+0

Да, я знаю ... но я думаю о ситуации, когда объект может быть где угодно в дереве объектов. Я не знаю структуру объекта, которого я должен ожидать, но я точно знаю, что существует «объект» –

-1
result = obj.library_items.filter(o => subjects.indexOf(o.subject) > -1) 
+0

Пожалуйста, добавьте некоторое объяснение. Кодовые ответы менее полезны для будущих читателей и не объясняют ошибку OP или как подойти к проблеме. В настоящее время этот ответ не совсем правильный. – Xufox

0

Вы можете использовать Array#filter и Array#includes

var items = { library_items: [{ id: "23453", artifactID: "", title: "Physics Basics", subject: "Physics" }, { id: "23453", artifactID: "", title:"Chemistry Basics", subject: "Chemistry" }] }, 
 
    subjects = ['Physics', 'Biology', 'Mathematics'], 
 
    filtered = items.library_items.filter(x => subjects.includes(x.subject)); 
 

 
console.log(filtered);

0

Я использую lodash (https://lodash.com/docs) в каждом проекте. Они создают массивный массив методов и оберток, которые сделают вашу жизнь намного проще.

var items = { 
"library_items": 
    [ 
    { 
     "id": "23453", 
     "artifactID": "", 
     "title":"Physics Basics", 
     "subject": "Physics" 

    }, 
    { 
     "id": "23453", 
     "artifactID": "", 
     "title":"Chemistry Basics", 
     "subject": "Biology" 

    } 

    ] 
}; 
var subjects = ['Physics', 'Physics', 'Mathematics']; 
_.find(items["library_items"], function(o) {  
    return subjects.indexOf(o.subject) > -1;  
}); 

Если вы не хотите устанавливать дополнительные пакеты, я бы пошел с ответом Агало!

0

Если производительность важна для вас. Я бы предложил вам другой подход.

С фильтром и indexOf (или включает в себя) ваша производительность алгоритма равна O (n * m). Для каждого элемента библиотеки вам нужно пройти каждый предмет.

Если вы создаете простую хеш-таблицу из массива объектов, сначала можете архивировать O (n + m). Во-первых, вы просматриваете каждый предмет и записываете его в хэш-таблицу, а затем для каждого элемента библиотеки, который вы можете проверить с помощью O (1) (из-за хэш-таблицы), нужен ли вам этот элемент.

Вот пример кода:

var items = { 
 
"library_items": 
 
    [ 
 
    { 
 
     "id": "23453", 
 
     "artifactID": "", 
 
     "title":"Physics Basics", 
 
     "subject": "Physics" 
 

 
    }, 
 
    { 
 
     "id": "23453", 
 
     "artifactID": "", 
 
     "title":"Chemistry Basics", 
 
     "subject": "Chemistry" 
 

 
    } 
 

 
    ] 
 
}; 
 
var subjects = ['Physics', 'Biology', 'Mathematics']; 
 
var allSubjects = {}; 
 
subjects.forEach(s => allSubjects[s] = true); 
 
var filtered = items.library_items.filter(x => allSubjects[x.subject]); 
 
console.log(filtered);

Смежные вопросы