我需要扫描多个对象并形成具有相同值的唯一键列表:
var data1={"L1":"X","L2":"X","L1L2Relate":"AND"}
var data2={"L2":"X","L3":"X"}
输出-所有带有“ X”作为值的键。
['L1','L2','L3'];
我尝试使用以下代码,但未给出期望的结果。请提出。
function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}
for (i =1 ;i<=7;i++)
{
arr.push(getKeyByValue(data1,'X'));
}
答案 0 :(得分:4)
使用Array.flatMap()
迭代对象列表(...objs
),然后使用Object.entries()
获得[键,值]对的数组。 Filter个项目没有要求的值,并且map个键数组。转换为Set,然后spread返回数组,以获得唯一键。
const fn = (value, ...objs) =>
[...new Set( // make unique with a Set and convert back to an array
objs.flatMap(Object.entries) // get an array of entries
.filter(([, v]) => v === value) // filter according to value
.map(([k]) => k) // get the keys
)]
const data1={"L1":"X","L2":"X","L1L2Relate":"AND"}
const data2={"L2":"X","L3":"X"}
const result = fn('X', data1, data2)
console.log(result)
与Array.concat()
而非Array.flatMap()
一起使用传播的兼容版本
const fn = (value, ...objs) =>
[...new Set( // make unique with a Set and convert back to an array
[].concat(...objs.map(Object.entries)) // get an array of entries
.filter(([, v]) => v === value) // filter according to value
.map(([k]) => k) // get the keys
)]
const data1={"L1":"X","L2":"X","L1L2Relate":"AND"}
const data2={"L2":"X","L3":"X"}
const result = fn('X', data1, data2)
console.log(result)
另一种选择是将对象列表简化为Set,使用Array.forEach()
迭代条目,然后将带有请求值的键仅添加到Set中。然后将Set散布回数组。
const fn = (value, ...objs) =>
[...objs.reduce((r, o) => {
Object.entries(o)
.forEach(([k ,v]) => {
if(v === value) r.add(k);
})
return r;
}, new Set())]
const data1={"L1":"X","L2":"X","L1L2Relate":"AND"}
const data2={"L2":"X","L3":"X"}
const result = fn('X', data1, data2)
console.log(result)