通过每个索引对象值从多维数组创建数组

时间:2018-12-23 18:30:33

标签: javascript

这是我的阵列

[
  {
    'data': [
      {
        'value': 'Red'
      },
      {
        'value': 'Small'
      },
      {
        'value': 'Good'
      }

    ]
  },
  {
    'data': [
      {
        'value': 'Black'
      },
      {
        'value': 'Medium'
      },
      {
        'value': 'Bad'
      }

    ]
  },
  {
    'data': [
      {
        'value': 'White'
      },
      {
        'value': 'Large'
      },
      {
        'value': 'Best'
      }

    ]
  }
]

我想要

[
  ['Red', 'Black', 'White'], // all values from first index
  ['Small', 'Medium', 'Large'], // all values from second index
  ['Good', 'Bad', 'Best'] // all values from third index
]

我尝试使用forEachfor...infilter等。但是我没有成功获得此输出

4 个答案:

答案 0 :(得分:4)

您可以使用reduce(),然后在reduce循环中使用forEach()。在forEach循环中,使用索引确定要推送的数组。在该索引处还没有任何价值,创建一个新数组并推送到其中:

let data = [{'data': [{'value': 'Red'},{'value': 'Small'},{'value': 'Good'}]},{'data': [{'value': 'Black'},{'value': 'Medium'},{'value': 'Bad'}]},{'data': [{'value': 'White'},{'value': 'Large'},{'value': 'Best'}]}]

let arr = data.reduce((arr, item) => {            // look at each item in the data array
  item.data.forEach(({value}, index) => {         // look at each item in the item.data array
    (arr[index] || (arr[index] = [])).push(value) // create and array if necessary and push value into it
  })
  return arr
},[])

console.log(arr)

答案 1 :(得分:0)

您也可以尝试以下示例所示。

  

filter()方法基本上是在我们希望基于某些条件过滤输出时使用的方法。

var a = [
    {
       'data': [
       {
          'value': 'Red'
       },
       {
        'value': 'Small'
       },
      {
        'value': 'Good'
       }
     ]
    },
    {
        'data': [
        {
        'value': 'Black'
        },
        {
        'value': 'Medium'
        },
       {
        'value': 'Bad'
       }
     ]
   },
     {
     'data': [
      {
        'value': 'White'
      },
      {
        'value': 'Large'
      },
      {
        'value': 'Best'
      }
      ]
     }
    ]


var obj = {};

for(var o of a) {
    for(var i in o.data) {
        if(obj[i] === undefined) {
            obj[i] = [o.data[i].value];
        } else {
            obj[i].push(o.data[i].value);
        }
    }
}

console. log(obj);
/*
{ '0': [ 'Red', 'Black', 'White' ],
  '1': [ 'Small', 'Medium', 'Large' ],
  '2': [ 'Good', 'Bad', 'Best' ] }
*/

答案 2 :(得分:0)

这是我为您解决的问题的解决方案,使用一个主循环遍历您要读取的差值属性的数量,并且在每个循环内使用方法Array.from()提供的功能

let a = [
    {'data': [
        {'value': 'Red'},
        {'value': 'Small'},
        {'value': 'Good'}
    ]},
    {'data': [
        {'value': 'Black'},
        {'value': 'Medium'},
        {'value': 'Bad'}
    ]},
    {'data': [
        {'value': 'White'},
        {'value': 'Large'},
        {'value': 'Best'}
    ]}
];

// The new array.
let newArr = [];

// Number of properties for each "data" object.
let keys = 3;

for (let k = 0; k < keys; k++)
{
    newArr.push(Array.from(a, (v) => {
       return v.data[k].value;
    }));
}

console.log(newArr);

或者,您可以将Array.from()替换为map(),如下所示:

for (let k = 0; k < keys; k++)
{
    newArr.push(a.map((v) => {
       return v.data[k].value;
    }));
}

答案 3 :(得分:-1)

var array = [
  {
    'data': [
      {
        'value': 'Red'
      },
      {
        'value': 'Small'
      },
      {
        'value': 'Good'
      }

    ]
  },
  {
    'data': [
      {
        'value': 'Black'
      },
      {
        'value': 'Medium'
      },
      {
        'value': 'Bad'
      }

    ]
  },
  {
    'data': [
      {
        'value': 'White'
      },
      {
        'value': 'Large'
      },
      {
        'value': 'Best'
      }

    ]
  }
]

var res = [];

for(var i in array)
{
    var subData = array[i]['data'];
    var tmp = [];
    for(var j in subData)
        tmp.push(subData[j]['value']);
    res.push(tmp);
}

console.log(res);