创建具有相同值的唯一键列表

时间:2019-12-14 09:50:44

标签: javascript object

我需要扫描多个对象并形成具有相同值的唯一键列表:

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

}

1 个答案:

答案 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)

相关问题