2017-02-20 8 views
0

У меня довольно сложный массив, созданный из API естественного языка Google. Я подаю ему абзац текста, и в нем содержится много информации о языке, касающейся такого абзаца.Извлечение данных из сложного массива без множества циклов FOR

Моя конечная цель - найти «ключевые слова» из этого абзаца, поэтому для этого я хочу поместить все «сущности» в плоский массив, посчитать дубликаты, а затем рассмотреть слова с наибольшим количеством дубликаты должны быть «ключевыми словами». Если он не найдет, то я буду вишневы выбирать слова из сущностей, которые я считаю наиболее значимыми.

Я уже знаю, объекты, которые могли бы существуют:

var entities = [ 
    'art', 
    'events', 
    'goods', 
    'organizations', 
    'other', 
    'people', 
    'places', 
    'unknown' 
]; 

Ниже приведен пример структуры массива я работаю.

input = [ 
{ 
language: { 
    entities: { 
    people: [ 
    { 
    name: "Paul", 
    type: "Person", 
    }, 
    { 
    name: "Paul", 
    type: "Person", 
    }, 
    ], 
    goods: [ 
    { 
    name: "car", 
    type: "Consumer_good", 
    } 
    ], //etc 
    } 
} 
} 
]; 

output = ["Paul", "Paul", "car"...]; 

Мой вопрос - что это лучший способ, чтобы преобразовать мой исходный массив в плоский массив, чтобы затем найти дубликаты без используя целую кучу для петель?

+0

Используйте один цикл, чтобы пройти через ваш основной массив объектов. Попросите его свойство быть массивом. Пропустите это и нажмите элемент в массив результатов, если он уже не indexOf вашего массива результатов. – fubbe

ответ

0

Если вы работаете с динамическими входными данными, не существует способов вокруг циклов или функций массива.

+0

Я понимаю, что это довольно неизбежно, я просто хотел знать, есть ли лучший способ, чем использовать цикл for в цикле for в цикле for и т. Д. – Aloogy

+0

@Aloogy Я пытаюсь использовать функции массива, такие как 'map',' filter' и 'reduce' для таких ситуаций, потому что у вас есть новая область для каждой итерации, а callbacka легче тестировать. – floriangosse

0

Вы можете рекурсивно перебирать input.language.entities и собирать все свойства .name в массив. Тогда у вас есть только один цикл :-).

После этого вы можете перебирать его, чтобы найти дубликаты. Если вы отсортируете его по алфавиту, прежде чем он станет проще (если две или более последовательных записей равны, есть дубликаты).

Но это может быть немного опасно, если google изменяет api или если он поставляет данные дерьма из-за неисправности.

Не входит ли язык.языков. Уже достаточно плоские, чтобы работать с ним?

0

Вы можете получить доступ все значения, используя этот формат:

input[0]["language"]["entities"]["people"][0].name 

input = [ 
 
{ 
 
language: { 
 
    entities: { 
 
    people: [ 
 
    { 
 
    name: "Paul", 
 
    type: "Person", 
 
    }, 
 
    { 
 
    name: "Paul", 
 
    type: "Person", 
 
    }, 
 
    ], 
 
    goods: [ 
 
    { 
 
    name: "car", 
 
    type: "Consumer_good", 
 
    } 
 
    ], //etc 
 
    } 
 
} 
 
} 
 
]; 
 
console.log(input[0]["language"]["entities"]["people"][0].name);

Тогда вы могли бы сделать что-то вроде этого:

for (var entry in input[0]["language"]["entities"]) { 
    console.log(entry); 
} 

ИЛИ, если Я понимаю d вы неправильно,

Вы можете использовать эту функцию, чтобы включить JavaScript Object в массив с помощью этого (требует JQuery):

var myObj = { 
 
    1: [1, 2, 3], 
 
    2: [4, 5, 6] 
 
}; 
 

 
var array = $.map(myObj, function(value, index) { 
 
    return [value]; 
 
}); 
 

 

 
console.log(array[0][0]); 
 
console.log(array[0]); 
 
console.log(array);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Этот выход будет

1 

[1, 2, 3] 

[[1,2,3],[4,5,6]] 
0

Я закончил делать что-то подобное. Это некрасиво, но он выполняет свою работу.

var result = []; 
var known_entities = ['art','events','goods','organizations','other','people','places','unknown'];   
    for(i=0; i < known_entities.length; i++){ 
     var entity = known_entities[i]; 
     if(language.entities[entity]){ 
      for(var j in language.entities[entity]){ 
       var word = language.entities[entity][j].name 
       result.key_words.push(word); 
      } 
     } 
    }