无法转换JavaScript中的对象数组

时间:2018-10-27 15:18:31

标签: javascript

我正在尝试将此对象数组转换为其他格式:

let data = [
    { 
        Dimension_ID: 1,
        A1: 'N'
    }, {
        Dimension_ID: 2,
        A1: 'N'
    }, {
        Dimension_ID: 3,
        A1: 'N'
    }, {
        Dimension_ID: 917,
        A1: 'P'
    }, {
        Dimension_ID: 918,
        A1: 'P'
    }, {
        Dimension_ID: 919,
        A1: 'P'
    }, {
        Dimension_ID: 1,
        B1: 'Q'
    }, {
        Dimension_ID: 2,
        B1: 'Q'
    }, {
        Dimension_ID: 3,
        B1: 'Q'
    }
];

我想创建一个像这样的新对象:

let params = [];

params['filterValues'] =  { A1: [ 'N', 'P' ],B1: [ 'Q' ] };

这是我要使用的JavaScript代码。

  if(params.filterValues != undefined){
                    params.dimensionIds2 = [];
                        for (var key in params.filterValues) {
                            if(params.filterValues[key].length > 0)
                            params.filterValues[key].map((value)=>{
                                let filterData = data.filter(item => item[key] == value);
                                filterData.map((filterItem)=>{
                                    console.log(key,value,filterItem.Dimension_ID);
                                    //params.dimensionIds2[key][value].push(filterItem.Dimension_ID)   
                                })

                            })

                          }
                    }

我可以像这样在循环中使用console.log值:

  • A1 N 1
  • A1 N 2
  • A1 N 3
  • A1 P 917
  • A1 P 918
  • A1 P 919
  • B1问题1
  • B1 Q 2
  • B1问题3

我想使用以下数据:

data ['A1'] ['N'] = [1,2,3]

data ['A1'] ['P'] = [917,918,919]

data ['B1'] ['Q'] = [1,2,3]

我也尝试使用此代码:

params.dimensionIds2[key][value].push(filterItem.Dimension_ID)

2 个答案:

答案 0 :(得分:0)

您可以尝试以此来整理数据。

let data = [
    {Dimension_ID: 1, A1: 'N'},
    {Dimension_ID: 2, A1: 'N'},
    {Dimension_ID: 3, A1: 'N'},
    {Dimension_ID: 917, A1: 'P'},
    {Dimension_ID: 918, A1: 'P'},
    {Dimension_ID: 919, A1: 'P'},
    {Dimension_ID: 1, B1: 'Q'},
    {Dimension_ID: 2, B1: 'Q'},
    {Dimension_ID: 3, B1: 'Q'},];

const params = {A1: ['N', 'P'], B1: ['Q']};

const organize = (data, params) =>

    Object.keys(params).reduce((acc, val) => {

        acc[val] = params[val].reduce((a, v) => {
            
            a[v] = data
                      .filter((value) => value[val] === v)
                      .map(value => value.Dimension_ID);
            
            return a;
        }, {});

        return acc;
    }, {});

console.log(organize(data, params));

答案 1 :(得分:0)

另一种嵌套的Array#reduce()方法。请注意,您要params并将结果作为对象而不是数组,以便为​​键使用字符串值

let params = {};
let data = [{ Dimension_ID: 1,A1: 'N'},{ Dimension_ID: 2,A1: 'N'},{ Dimension_ID: 3,A1: 'N'},
{ Dimension_ID: 917,A1: 'P'},{ Dimension_ID: 918,A1: 'P'},{ Dimension_ID: 919,A1: 'P'},
{ Dimension_ID: 1,B1: 'Q'},{ Dimension_ID: 2,B1: 'Q'},{ Dimension_ID: 3,B1: 'Q'},];
params['filterValues'] =  { A1: [ 'N', 'P' ],B1: [ 'Q' ] };

let res = data.reduce((a, c) => {
  return Object.entries(params['filterValues']).reduce((a,[k, arr]) => {
    a[k] = a[k] || {}
    return arr.reduce((a,v) => {
      const o = a[k][v] = a[k][v] || [];
      c[k] && c[k] === v && o.push(c.Dimension_ID)
      return a
    },a);    
  },a);  
}, {});

console.log(res)