使用动态变量映射数据

时间:2019-01-27 13:31:58

标签: javascript

我在尝试达成目标时遇到了一些麻烦。所以我有一些数据

let data = [
  {
    "ID": 123456,
    "Date": "2012-01-01",
    "Irrelevant_Column_1": 123,
    "Irrelevant_Column_2": 234,
    "Irrelevant_Column_3": 345,
    "Irrelevant_Column_4": 456
  },
  ...
]

我想删除不相关的列。所以有人建议使用地图

data = data.map(element => ({ID: element.ID, Date: element.Date}))

问题是,我不想定义列。我让用户选择要保留的列,并将其分配给变量。然后我可以做类似的事情

let selectedId = this.selectedIdCol;

问题是,我现在无法在地图上使用它。我正在尝试

let selectedId = this.selectedIdCol;
this.parsed_csv = data.map(element => (
    {ID: element.selectedId, Date: element.Date}
));

但这似乎不起作用,只是返回日期。另外,我的IDE表示该变量未使用。那么如何将selectedId变量用作map函数的一部分?

谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用Bracket notation表示法和帮助器功能

每当要使用变量访问属性时,都需要使用[]表示法。

let data = [{"ID": 123456,"Date": "2012-01-01","column_1": 123,"column_2": 234,"column_3": 345,"column_4": 456},{"ID": 123456,"Date": "2018-10-01",   "column_1": 123,"column_2": 234,"column_3": 345,"column_4": 46},]

function selectDesired(data,propName1,propName2){
  return data.map(e=> ({[propName1]: e[propName1], [propName2]: e[propName2]}))
}

console.log(selectDesired(data, 'Date', 'column_4'))

答案 1 :(得分:0)

此处说明了基本技术,假设用户选择的column_name为“ ID”

let data = [
     {
       "ID": 123456,
       "Date": "2012-01-01",
       "Irrelevant_Column_1": 123,
       "Irrelevant_Column_2": 234,
       "Irrelevant_Column_3": 345,
       "Irrelevant_Column_4": 456
     }
];
let column_name = "ID";
let curated = data.map(element=>({[column_name]: element[column_name]}));
   
console.log(curated)

如果希望用户能够多选其列,(假设上面的数据仍在范围内)

let user_selection = ["ID","Date"];
let curated = data.map(
   (element)=>
   {
      let item = {};
      user_selection.forEach(
         (property)=>
         {
           item[property] = element[property];
         }
      return item;
   }
);

要设置一个可以处理多种调用情况而又不会受到骇客打补丁的源历史的功能,请设置该功能的签名以接收一系列的属性。

如果您想扩展接受能力

  • csv属性列表
  • 直接传递的一组属性名称
  • 属性名称数组

您可以假定签名中的properties参数是属性分组的可迭代属性,其中最基本的分组是单例。

注释嵌入在示例代码中,以进行更详细的说明

 var getProjection = (data,...properties) =>
 {
     //+=================================================+
     // Initialize the projection which will be returned
     //+=================================================+
     let projection = {};

     //+=================================================+
     // Set up the property mapping func
     //+=================================================+
     let safe_assign = (source, target ,propertyDesignator)=>
     {
        if(source[propertyDesignator])
        {
           target[propertyDesignator] = source[propertyDesignator];
        }
     };

     //+=====================================================+
     // Iterate the properties list, assuming each element to
     // be a property grouping
     //+=====================================================+
     properties.forEach(
        (propertyGroup)=>
        {
           //+-----------------------------------------------+
           // If the propertyGroup is not an array, perform
           // direct assignment
           //+-----------------------------------------------+
           if(!Array.isArray(propertyGroup))
           {
              //+-------------------------------------------+
              //Only map the requested property if it exists
              //+-------------------------------------------+
              safe_assign(data,projection,propertyGroup);
           }


           //+-----------------------------------------------+
           // If the propertyGroup *is* an array, iterate it
           // This technique obviously assumes that your
           // property groupings are only allowed to be one
           // level deep. This is for accommodating distinct
           // calling conventions, not for supporting a deeply
           // nested object graph. For a deeper object graph,
           // the technique would largely be the same, but
           // you would need to recurse.
           //+-----------------------------------------------+
           if( Array.isArray(propertyGroup))
           {
              propertyGroup.forEach(
                 (property)=>
                 { 
                    safe_assign(data,projection,property);
                 }
           }
       }
    );
    //+===================================+
    // Return your projection
    //+===================================+
    return projection;
 };


 //+--------------------------------------+
 //Now let's test
 //+--------------------------------------+
 let data = [
   {ID:1,Foo:"Foo1",Bar:"Bar1",Baz:"Inga"},
   {ID:2,Foo:"Foo2",Bar:"Bar2",Baz:"Ooka"},
   {ID:3,Foo:"Foo3",Bar:"Bar3",Baz:"oinga",Floppy:"Floop"},
   {ID:4,Foo:"Foo4",Good:"Boi",Bar:"Bar3"Baz:"Baz"}
 ];


 //***************************************
 //tests
 //***************************************

 var projection1 = getProjection(data.find(first=>first),"ID","Baz"));//=>{ID:1,Baz:"Inga"}

 var projection2 = getProjection(data[0],["ID","Baz"]);//=>{ID:1,Baz:"Inga"}
 var projection3 = getProjection(data[0],...["ID","Baz"]);//=>{ID:1,Baz:"Inga"}


 var user_selected_properties = ["ID","Good","Baz"];

 var projections = data.map(element=>getProjection(element,user_selected_properties));
 //+=====================================+
 // projections = 
 // [
 //    {ID:1,Baz:"Inga"},
 //    {ID:2,Baz:"Ooka"},
 //    {ID:3,Baz:"oinga"},
 //    {ID:4,Good:"Boi",Baz:"Baz"}
 // ];
 //+=====================================+
相关问题