过滤基于对象数组的对象数组返回相同的结果
目标是将硬编码的数据库列名从我的React组件移除到配置文件中。而不是使用data.X,它将是data.A,如下所示。这样,如果他们将X更改为其他内容,我只需要更改X的配置文件,然后在我的React组件中随时更新它的配置文件,因为data.A位于组件中。过滤基于对象数组的对象数组返回相同的结果
问题是过滤只返回数据中的最后一个对象。任何帮助将不胜感激,任何关于删除嵌套for循环的建议将有助于学习。
所需的输出:
[
{
"A": 1,
"B": 2,
},
{
"A": 4,
"B": 5,
},
{
"A": 7,
"B": 8,
},
];
电流输出:
[
{
"A": 7,
"B": 8,
},
{
"A": 7,
"B": 8,
},
{
"A": 7,
"B": 8,
},
];
let data = [
{
"X": 1,
"Y": 2,
"Z": 3,
},
{
"X": 4,
"Y": 5,
"Z": 6,
},
{
"X": 7,
"Y": 8,
"Z": 9,
},
];
let keys = {
A: 'X',
B: 'Y',
};
let keyChain = {};
let cleanedData = [];
for (let key in keys) {
keyChain[key] = '';
}
for (let i in data) {
cleanedData[i] = keyChain;
for (let key in keys) {
if (keys[key] in data[i]) {
cleanedData[i][key] = data[i][keys[key]];
};
}
}
console.log(cleanedData);
的代码的最后一部分就变成那么下面就可以实现
for (let i in data) {
cleanedData[i] ={}
for (let key in keys) {
if (keys[key] in data[i]) {
cleanedData[i][key] = data[i][keys[key]];
};
}
}
console.log(cleanedData);
let data = [
{
"X": 1,
"Y": 2,
"Z": 3,
},
{
"X": 4,
"Y": 5,
"Z": 6,
},
{
"X": 7,
"Y": 8,
"Z": 9,
},
];
let keys = {
A: 'X',
B: 'Y',
};
let keyChain = {};
let cleanedData = [];
// construct the placeholder key value pair array
for (let key in keys) {
keyChain[key] = '';
}
// check keys to see if there's a match with the json
for (let i in data) {
cleanedData[i] ={}
for (let key in keys) {
if (keys[key] in data[i]) {
cleanedData[i][key] = data[i][keys[key]];
};
}
}
console.log(cleanedData);
希望它可以帮助
是的,是的,谢谢! – Chad
那是因为你重复使用相同的keyChain
对象作为新的占位符,所以这是同一个对象。您需要创建一个新的每次:
cleanedData[i] = { ...keyChain }; // instead of cleanedData[i] = keyChain;
const data = [
{
"X": 1,
"Y": 2,
"Z": 3,
},
{
"X": 4,
"Y": 5,
"Z": 6,
},
{
"X": 7,
"Y": 8,
"Z": 9,
},
];
const keys = {
A: 'X',
B: 'Y',
};
let keysReMap = {};
for (var [key, value] of Object.entries(obj)) {
keysReMap[value] = key;
}
const cleanedData = data.map((val, key) => {
const newKey = keysReMap[key];
return {
[newKey]: val
};
});
恕我直言,你错过了什么是钥匙串对象使用相同的每个cleanedData数组元素。你必须永远记住,JavaScript使用引用对象,所以每一行:
cleanedData[i] = keyChain; // same object
// ...
cleanedData[i][key] = data[i][keys[key]];
// modify keyChain object attributes
你,在结果,相同的对象和值引用数组是最后一次修改。
尝试使用类似(ES5方式):
cleanedData[i] = new Object(); // new object
它比预期的方式更容易解决。只需使用map
即可。
let filteredData = data.map((item) => ({'A' : item.X, 'B' : item.Y}));
你每次都简单地映射每个项目的element.X
到A
和element.Y
到B
到一个新的对象。
let data = [
{
"X": 1,
"Y": 2,
"Z": 3,
},
{
"X": 4,
"Y": 5,
"Z": 6,
},
{
"X": 7,
"Y": 8,
"Z": 9,
},
];
let filteredData = data.map((item) => ({'A' : item.X, 'B' : item.Y}));
console.log(filteredData);
上面的脚本需要1496412529493.929ms
来完成,而在一个接受的答案需要1496412584210.4958ms
这是有点慢。
他可能意味着硬编码 - ))或手动输入 – marmeladze
@Chad你想要的输出是什么?最后你想看到什么? – marmeladze
谢谢,更新! – Chad