繁体   English   中英

从对象数组中删除动态键

[英]Removing dynamic keys from array of objects

上一个问题最接近我的好奇心。 我尝试了 indexOf() 和 filter() 的几种变体但没有成功

我有一个对象数组( exampleDat ):

[{id:1, value:"100", name:"dog", D1: 10, D2: 67, D3: 33},
{id:2, value:"200", name:"cat", D1: 66, D2: 41, D3: 34},
{id:3, value:"300", name:"fish", D1: 23, D2: 45, D3:},
{id:4, value:"400", name:"mouse", D1: 13, D2: 55, D3:},
{id:5, value:"500", name:"snake", D1: 7, D2: 9, D3:}]

另一个函数中,我返回一个数组,其中包含我需要的这些“键”中的哪一个。 这个数组是动态变化的,所以不可能把它们全部输入出来。 例如,以下任何一个例子都是可行的,

useThese1 = ['D1','D2'] //Want exampleDat returned with only these key,value 'columns' returned
useThese2 = ['id','D1','D2','D3'] //Want exampleDat return with only these key,value 'columns' returned
useThese3 = ['value','D2','D3'] //Want exampleDat returned with only these key,value 'columns' returned

所以,我需要的值在动态映射useThese阵列的exampleDat阵列

如果我知道确切的列,我可以手动输入它:

exampleDat.map(d => {return {D1: d.D1, D2: d.D2}})

但我需要类似的东西:

dat.map(d => useThese1.map(g =>  {return {something?}}) ???

在 R 中,它很容易是exampleDat[,colnames(exampleDat) %in% useThese1]

您可以映射新键。

 const mapWith = (array, keys) => array.map(o => Object.fromEntries(keys.map(k => [k, o[k]]))), data = [{ id: 1, value: "100", name: "dog", D1: 10, D2: 67, D3: 33 }, { id: 2, value: "200", name: "cat", D1: 66, D2: 41, D3: 34 }, { id: 3, value: "300", name: "fish", D1: 23, D2: 45, D3:97}, { id: 4, value: "400", name: "mouse", D1: 13, D2: 55, D3:98}, { id: 5, value: "500", name: "snake", D1: 7, D2: 9, D3:99}], result1 = mapWith(data, ['D1', 'D2']), result2 = mapWith(data, ['id', 'D1', 'D2', 'D3']), result3 = mapWith(data, ['value', 'D2', 'D3']); console.log(result1); console.log(result2); console.log(result3);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

Object.fromEntries相对较新,但很容易填充。

这是我的解决方案。 这使用了 ES5 Javascript 函数

 const selectKeys = (keys, data) => { return data.map(item => keys.reduce((prev, key) => { prev[key] = item[key] return prev }, {})) } const selData1 = selectKeys(useThese1, data) const selData2 = selectKeys(useThese2, data) const selData3 = selectKeys(useThese3, data)

你可以这样做:

 const arr = [{id:1, value:"100", name:"dog", D1: 10, D2: 67, D3: 33}, {id:2, value:"200", name:"cat", D1: 66, D2: 41, D3: 34}, {id:3, value:"300", name:"fish", D1: 23, D2: 45, D3:11}, {id:4, value:"400", name:"mouse", D1: 13, D2: 55, D3:11}, {id:5, value:"500", name:"snake", D1: 7, D2: 9, D3:11}]; const useThese1 = ['D1','D2']; const useThese2 = ['id','D1','D2','D3']; const useThese3 = ['value','D2','D3']; const getResult = (keys) => arr.map(v => keys.reduce((a, c) => (a[c] = v[c], a), {})); [useThese1, useThese2, useThese3].forEach(v => console.log(getResult(v)));

你可以做这样的事情

const arr = [
  { id: 1, value: "100", name: "dog", D1: 10, D2: 67, D3: 33 },
  { id: 2, value: "200", name: "cat", D1: 66, D2: 41, D3: 34 },
  { id: 3, value: "300", name: "fish", D1: 23, D2: 45, D3: 34 },
  { id: 4, value: "400", name: "mouse", D1: 13, D2: 55, D3: 34 },
  { id: 5, value: "500", name: "snake", D1: 7, D2: 9, D3: 34 }
];

function dynamicFilter(data, requiredKeys) {
    return data.map((item) => {
        const result = {};
        requiredKeys.forEach(key => result[key] = item[key]);
        return result;
    });
}

console.log(dynamicFilter(arr, ['D1','D2']));
console.log(dynamicFilter(arr, ['id','D1','D2','D3']));

这是一种必要的方法。 可以使用 ES6 数组方法缩短它。

 let exampleDat = [ {id:1, value:"100", name:"dog", D1: 10, D2: 67, D3: 33}, {id:2, value:"200", name:"cat", D1: 66, D2: 41, D3: 34}, {id:3, value:"300", name:"fish", D1: 23, D2: 45, D3: 8}, {id:4, value:"400", name:"mouse", D1: 13, D2: 55, D3: 8}, {id:5, value:"500", name:"snake", D1: 7, D2: 9, D3: 8} ], useThese1 = ['D1','D2'] function getColumns(data, useWhich){ let result = []; for(let row of data){ let keys = Object.keys(row); let filteredRow = {}; for(let key of keys){ if(useWhich.includes(key)){ filteredRow[key] = row[key]; } } result.push(filteredRow); } return result; } console.log(getColumns(exampleDat, useThese1));

这是已接受答案的“傻瓜”版本。
(更详细的变量名称帮助我理解算法的工作原理。)

 const selectColumns = (unfilteredData, colsToKeep) => unfilteredData.map(row => Object.fromEntries(colsToKeep.map( col => [col, row[col]] ) ) ), data = [ { id: 1, value: "100", name: "dog", D1: 10, D2: 67, D3: 33 }, { id: 2, value: "200", name: "cat", D1: 66, D2: 41, D3: 34 }, { id: 3, value: "300", name: "fish", D1: 23, D2: 45, D3:97 }, { id: 4, value: "400", name: "mouse", D1: 13, D2: 55, D3:98 }, { id: 5, value: "500", name: "snake", D1: 7, D2: 9, D3:99 } ], colNames1 = ['D1', 'D2'], result1 = selectColumns(data, colNames1); console.log(result1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM