【问题标题】:how to get the object key if the object and array value matches in javascript如果对象和数组值在javascript中匹配,如何获取对象键
【发布时间】:2022-01-10 09:32:22
【问题描述】:

我想知道如何比较对象值和数组值 在javascript中

如果array valueobject value相同,那么如何返回

object key javascript 中的值


var result = obj.values(obj).includes(arr2) ? 
'status: active' : 'status: inactive'

var obj = {
  "active": 12,
  "inactive": 14
  "neutral": 16
}

var arr1=[12]
var arr2=[12, 14]
var arr3=[12, 16]

Expected Output

//for arr1
status: active
// for arr2
status: active
status: neutral
// for arr3
status: active
status: inactive

【问题讨论】:

  • 这能回答你的问题吗? How to iterate over a JavaScript object?
  • 您的最新编辑似乎已将预期输出交换为 arr2 和 arr3
  • @Terry,感谢回复,对于任何传递的数组,如果对象值与数组值匹配,则应返回对象键值
  • 是的,那么 arr2 应该返回“活动,不活动”,而 arr3 应该返回“活动,中性”。您的预期输出被错误地交换为 arr2 和 arr3。
  • 输出格式应该是什么?它只是数组['active', 'inactive'] 还是对象数组[{ status: 'active' }, { status: 'inactive' }]

标签: javascript arrays loops object array-map


【解决方案1】:

您可以简单地遍历数组,然后尝试获取Object.entries(obj) 返回的[key, value] 元组,其value 与数组值匹配。找到后,返回元组中的key,即:

arr.map(v => Object.entries(obj).find(x => x[1] === v)[0]);

注意:如果您的数组可能包含对象中存在的值,则上面的代码将引发错误,因为.find() 将返回未定义。如果是这种情况,您需要捕获使用无效值的情况(防御性设计):

arr.map(v => {
  const foundTuple = Object.entries(obj).find(x => x[1] === v);
  return foundTuple ? foundTuple[0] : null;
});

请参阅下面的概念验证:

const obj = {
  "active": 12,
  "inactive": 14,
  "neutral": 16
}

const arr1 = [12];
const arr2 = [12, 14];
const arr3 = [12, 16];
const invalid_arr = [12, 999];

function getKeys(obj, arr) {
  return arr.map(v => {
    const foundTuple = Object.entries(obj).find(x => x[1] === v);
    return foundTuple ? foundTuple[0] : null;
  });
}

console.log(getKeys(obj, arr1));
console.log(getKeys(obj, arr2));
console.log(getKeys(obj, arr3));
console.log(getKeys(obj, invalid_arr));

【讨论】:

    【解决方案2】:

    另一种解决方案

    const obj = { "active": 12, "inactive": 14, "neutral": 16 }
    
    const arr1 = [12];
    const arr2 = [12, 14];
    const arr3 = [12, 16];
    
    const getStatuses= (obj, arr) => arr
      .map(arrValue => {
        const [status] = Object.entries(obj)
          .find(([objKey, objValue]) => objValue === arrValue) 
          ?? [null];
        return { status };
      });
    
    console.log(getStatuses(obj, arr1));
    console.log(getStatuses(obj, arr2));
    console.log(getStatuses(obj, arr3));
    .as-console-wrapper{min-height: 100%!important; top: 0}

    【讨论】:

      【解决方案3】:

      您应该检查数组是否包含对象值,反之亦然:

      function* matches(object, array) {
        for (const [key, value] of Object.entries(object)) {
          if (array.includes(value))
            yield key;
        }
      };
      
      for (const match of matches(obj, arr1))
        console.log(`status: ${match}`);
      
      for (const match of matches(obj, arr2))
        console.log(`status: ${match}`);
      
      for (const match of matches(obj, arr3))
        console.log(`status: ${match}`);
      

      这应该可行。

      【讨论】:

      • 感谢回复,但我应该返回对象键值而不是 true 或 false
      • 然后我用[key, value] 更改了回报,但它没有写在最初的问题中。我希望这个答案。
      • 感谢您的帮助,这不起作用,已更新我的代码,
      • 好的,我认为您的输出与我的最新更改完全一致。
      【解决方案4】:

      使用Object.keys() 获取键,然后通过从原始对象中获取值来过滤它们,并检查它是否包含在数组中:

      const getStatus = (obj, arr) => Object.keys(obj)
        .filter(key => arr.includes(obj[key]))
        
      const obj = { "active": 12, "inactive": 14, "neutral": 16 }
      
      const arr1 = [12];
      const arr2 = [12, 14];
      const arr3 = [12, 16];
      
      console.log(getStatus(obj, arr1));
      console.log(getStatus(obj, arr2));
      console.log(getStatus(obj, arr3));

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-12
        • 1970-01-01
        • 1970-01-01
        • 2020-02-02
        相关资源
        最近更新 更多