【问题标题】:getting distinct values from array of arrays in Javascript从Javascript中的数组数组中获取不同的值
【发布时间】:2016-04-27 14:58:43
【问题描述】:

我的数据格式如下..

    var data= [['typeName', 'valueName'], ['type1', 'value1'],
['type1', 'value2'],['type2', 'value3'],['type2', 'value4']]

我希望将上述数据转换为如下数据..

    var resultdata=[{'typeName':'type1','valueName':['value1','value2']},
{'typeName':'type2','valueName':['value3','value4']}]

基本上我会选择不同的“typeName”值,然后按“typeName”值对“valueName”值进行分组。

我最好只使用 knockoutjs、lodash 或 underscorejs,因为我的解决方案已经使用它们,但我也愿意接受其他解决方案..

真诚感谢所有帮助

谢谢

【问题讨论】:

  • 从结构中创建结果数据的标准是什么?

标签: javascript knockout.js underscore.js lodash


【解决方案1】:

我认为这个使用下划线的解决方案应该可以解决问题:

var result= _.chain(data)
    .rest()
    .groupBy( value => value[0])
    .map( (value,key) => ({ [data[0][0]]: key, [data[0][1]]: _.map(value, val => val[1])}))
    .value(); 

此解决方案使用rest 跳过数据数组中的第一项(类型描述符)。然后数组是 grouped 数组中的第一个值(类型),并且映射使用 es6 object initializer 表示法以所需形式返回分组。

【讨论】:

  • 如果我将数据更改为 [['typeName', 'valueName','extraName'], ['type1', 'value1','extra1'], ['type1', 'value2 ','extra2'],['type2', 'value3','extra3'],['type2', 'value4','extra4']],valuename有extraname值,保证valuename始终是可行的具有第二个字段值。此外,是否可以不在地图中硬编码类型名和值名..
  • 调整代码以使用第一个数据项中的字符串作为结果的属性名称并使用第二个值
  • 令人印象深刻的解决方案!我推荐一些 cmets,因为代码在阅读时不太容易理解。
【解决方案2】:

给定结果为:

var resultdata=[
    {'typeName':'type1'},{'valueName':['value1','value2']},
    {'typeName':'type2'},{'valueName':['value3','value4']}
]

我将调用 'typeName' 类别和 'valueName' 项目。

由于原始数据是这样的:

var data= [
    ['typeName', 'valueName'], 
    ['type1', 'value1'],
    ['type1', 'value2'],
    ['type2', 'value3'],
    ['type2', 'value4']
]

很明显有一个模式。第一行数据将用作类别和项目的标签。其余所有数据表示类别和项目中使用的值。

第一步是提取标签:

 var categoryLabel = data[0][0];
 var itemLabel = data[0][1];

接下来,需要确定唯一类别,因此我们将使用 reduce 来构建唯一类别数组:

 var categories = data
     .filter(function(row, i) { return i > 0 }) // remove the labels
     .reduce(function(arrCategories, currRow) {
         // Add the current rows' category if it doesn't already exist
         var currCategory = currRow[0];
         if (arrCategories.indexOf(currCategory) === -1) {
           return arrCategories.concat(currCategory);
         }
         return arrCategories;
     }, [])

现在您有了一组类别,您只需遍历每个类别即可找到属于它的所有项目:

 var valuesByCategory = {};
 categories.forEach(function(category) {
   // find all the data items that match the category
   var items = data
     .filter(function(row) { return row[0] === category; })
     .reduce(function(arrItems, currRow) {
       var currItem = currRow[1];
       if (arrItems.indexOf(currItem) === -1) {
          return arrItems.concat(currItem);
       }
       return arrItems;
     }, []);
   valuesByCategory[category] = items;
 });

现在所有的数据都已经解析出来了,剩下要做的就是构建结果数组:

 var resultdata = [];
 // iterate through each of the categories
 categories.forEach(function(category) {
   // using the category label, output an object with the label and category
   var categoryObj = {};
   categoryObj[categoryLabel] = category;
   resultdata.push(categoryObj);


   // Next, create a items object containing all the values
   var itemsObj = {};
   itemsObj[itemLabel] = valuesByCategory[category];
   resultdata.push(itemsObj);
 }

就是这样:)

最好的部分是您不需要任何外部库。这都是 ES2015 javascript!

【讨论】:

  • 真诚感谢您的帮助,特别是解释,当我把它放在第一位时,您给出的答案与我的问题相匹配,结果数据结构为 [ {'typeName':'type1'},{'valueName' :['value1','value2']}, {'typeName':'type2'},{'valueName':['value3','value4']} ],但后来我将结构更新为 [{'typeName ':'type1','valueName':['value1','value2']}, {'typeName':'type2','valueName':['value3','value4']}],我确定您在 mychanges 之前开始,如果您更改答案,将不胜感激
  • 我会,但你已经选择了答案,所以没有意义:)
  • 好的,明白了.. var categoryObj = {}; categoryObj[categoryLabel] = 类别; categoryObj[itemLabel] = valuesByCategory[category]; resultdata.push(categoryObj);
【解决方案3】:

这是 Gruff Bunnies 解决方案的 lodash 版本:

var data= [['typeName', 'valueName'], ['type1', 'value1'], ['type1', 'value2'],['type2', 'value3'],['type2', 'value4']]
var names = data[0]
var values = _.tail(data)

console.log(JSON.stringify(
  _(values)
    .groupBy(0)
    .map( (value, key) => ({ [names[0]]: key, [names[1]]: _.map(value, 1)}) )
    .value()
))

https://jsfiddle.net/nmf1fdf5/

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多