【问题标题】:Create a unique lists of keys with the same value创建具有相同值的唯一键列表
【发布时间】:2019-12-14 09:50:44
【问题描述】:

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

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

}

【问题讨论】:

  • 为什么L1L2Relate 不在您的输出中?
  • @NickParsons,我认为他想要具有相同值的唯一键..
  • 是唯一值键。
  • 如果data1 = { a: "X" }, data2 = { a: "notX" } 怎么办?无论如何添加a?顺便说一句,否决票可能源于没有明确提出问题的问题。您已经获得了示例输入/输出和“自己的尝试”部分,但是从您的文本中,我无法说出您想要什么。 “形成一个唯一的键列表”对于您似乎真正想要做的事情来说并不是一个正确的任务描述。

标签: javascript object


【解决方案1】:

使用 Array.flatMap() 迭代对象列表 (...objs) 并使用 Object.entries() 获取 [key, value] 对数组。 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)

另一种选择是将对象列表缩减为一个集合,使用Array.forEach() 迭代条目,并将请求值仅添加到集合中。然后将 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)

【讨论】:

  • 我得到 UnhandledPromiseRejectionWarning: TypeError: objs.flatMap is not a function。由于服务器限制,我在节点应用程序和版本 8 中使用它
猜你喜欢
  • 2020-09-12
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2019-03-12
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多