从没有大量FOR循环的复杂数组中提取数据

时间:2017-02-20 00:05:30

标签: javascript arrays multidimensional-array

我有一个相当复杂的数组,由Google的自然语言API生成。我给它添了一段文字,并提供了很多关于这一段的语言信息。

我的最终目标是从这一段中找到“关键词”,因此,要实现这一点,我想将所有“实体”放入一个平面数组,计算重复数,然后考虑具有最高重复数量的单词成为“关键词”。如果它没有找到任何,那么我会从我认为最重要的实体中挑选一些词。

我已经知道可以存在的实体:

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"...];

我的问题是 - 将我的初始数组转换为平面数组然后使用一大堆FOR循环找到没有的重复项的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

如果使用动态输入数据,则无法绕过循环或数组函数。

答案 1 :(得分:0)

您可以以递归方式迭代input.language.entities并将所有.name属性收集到数组中。然后你只有一个for循环: - )。

执行此操作后,您可以遍历它以查找重复项。如果您在更容易之前按字母顺序对其进行排序(如果两个或多个连续条目相等,则存在重复项。)

但是如果google更改api或者由于故障而提供垃圾数据可能会有点危险。

不是input.language.entities已经足够扁平化了吗?

答案 2 :(得分: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);
}

,如果我理解你错了,

您可以使用它将javascript对象转换为数组(需要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>
&#13;
&#13;
&#13;

这将输出

1

[1, 2, 3]

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

答案 3 :(得分: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);
           }
        }
    }