2017-04-01 100 views
0

从加工对象物1的阵列,我试图以形成另一个目的2.我写了这个下面一段代码,但我DONO这是正确的方法来实现目的2.形成新的对象与对象

var arr = []; 
    object1.filter(function(value) { 
           return value.hasOwnProperty("This Year"); // Get only elements, which have such a key 
            }).map(function(value) { 
           arr.push({value:value["This Year"]}); // Extract the values only 
            }); 

对象1

var obj=[ 
    { 
    "sno": 1, 
    "Last Year": 10000 
    }, 
    { 
    "sno": 2, 
    "Last Year": 11500 
    }, 
    { 
    "sno": 3, 
    "Last Year": 12500 
    }, 
    { 
    "sno": 4, 
    "This Year": 25400 
    }, 
    { 
    "sno": 5, 
    "Last Year": 15000 
    }, 
    { 
    "sno": 6, 
    "This Year": 29800 
    } 
] 

对象2 - 所需的结果

var dataset = [ 
     { 
      "seriesname": "Last Year", 
      "data": [ 
       { 
        "value": "10000" 
       }, 
       { 
        "value": "11500" 
       }, 
       { 
        "value": "12500" 
       }, 
       { 
        "value": "15000" 
       } 
      ] 
     }, 
     { 
      "seriesname": "This Year", 
      "data": [ 
       { 
        "value": "25400" 
       }, 
       { 
        "value": "29800" 
       } 
      ] 
     } 
    ] 

如果有人能帮助我更好approa CH。在我的代码中,我很难编写对象1的关键名称。是否可以用其他方式?

回答

2
var obj1 = [ 
    { 
    "sno": 1, 
    "Last Year": 10000 
    }, 
    { 
    "sno": 2, 
    "Last Year": 11500 
    }, 
    { 
    "sno": 3, 
    "Last Year": 12500 
    }, 
    { 
    "sno": 4, 
    "This Year": 25400 
    }, 
    { 
    "sno": 5, 
    "Last Year": 15000 
    }, 
    { 
    "sno": 6, 
    "This Year": 29800 
    } 
]; 

var dataset = []; 

["This Year", "Last Year"].forEach((series) => { 
    dataset.push({ 
     seriesname: series, 
     data: obj1.filter((el) => { 
       return el[series]; 
      }).map((el) => { 
       return { 
        value: el[series] 
       } 
      }) 
     }); 
}); 

console.log(JSON.stringify(dataset, null, 2)); 
+0

一个很好的答案应该包括它是如何回答这个问题,例如解释为什么你认为这比OP更“好”。 – RobG

+0

看起来我误解了这个问题。 – wostex

1

为了避免硬编码项,你可以使用RegExp寻找包含year单词的一个关键。

var arr = [{sno:1,"Last Year":1e4},{sno:2,"Last Year":11500},{sno:3,"Last Year":12500},{sno:4,"This Year":25400},{sno:5,"Last Year":15e3},{sno:6,"This Year":29800}], 
 
    res = [...new Set(arr.map(v => Object.keys(v).find(z => /year/i.test(z))))] 
 
      .map(c => ({seriesname: c, data: arr.filter(x => x[c]).map(a => ({value: a[c]}))})); 
 
    
 
console.log(res);

0

您可以通过输入数组不在sno从对象获得的唯一键的名称提取键,然后用减速机来改变数据形式。

var obj = [ 
 
    { 
 
    "sno": 1, 
 
    "Last Year": 10000 
 
    }, 
 
    { 
 
    "sno": 2, 
 
    "Last Year": 11500 
 
    }, 
 
    { 
 
    "sno": 3, 
 
    "Last Year": 12500 
 
    }, 
 
    { 
 
    "sno": 4, 
 
    "This Year": 25400 
 
    }, 
 
    { 
 
    "sno": 5, 
 
    "Last Year": 15000 
 
    }, 
 
    { 
 
    "sno": 6, 
 
    "This Year": 29800 
 
    } 
 
] 
 

 
const getSeries = obj => { 
 
    const emptyResult = getSeriesNames(obj).map(seriesName => ({ 
 
     seriesName, 
 
     data: [] 
 
    })); 
 
    
 
    return obj.reduce((result, item) => { 
 
     const series = result.filter(series => series.seriesName in item)[0] 
 
     series.data.push({ value: item[series.seriesName] }); 
 
     return result; 
 
    }, emptyResult); 
 
} 
 

 
const getSeriesNames = obj => obj.reduce((names, item) => { 
 
    Object.keys(item) 
 
    .filter(key => key !== 'sno') 
 
    .forEach(key => { 
 
     if (!names.includes(key)) { 
 
      names.push(key); 
 
     } 
 
    }); 
 
    return names; 
 
}, []); 
 

 
console.log(getSeries(obj));