过滤基于对象数组的对象数组返回相同的结果

过滤基于对象数组的对象数组返回相同的结果

问题描述:

目标是将硬编码的数据库列名从我的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, 
    }, 
]; 

fiddle

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); 
+1

他可能意味着硬编码 - ))或手动输入 – marmeladze

+1

@Chad你想要的输出是什么?最后你想看到什么? – marmeladze

+1

谢谢,更新! – Chad

的代码的最后一部分就变成那么下面就可以实现

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);

希望它可以帮助

+0

是的,是的,谢谢! – Chad

那是因为你重复使用相同的keyChain对象作为新的占位符,所以这是同一个对象。您需要创建一个新的每次:

cleanedData[i] = { ...keyChain }; // instead of cleanedData[i] = keyChain; 

Fiddle

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.XAelement.YB到一个新的对象。

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这是有点慢。