首页 > 解决方案 > 如果 Key 存在于也包含数组的 JavaScript 对象中,则查找并返回值

问题描述

var OBJ = {
    code: 42,
    item1: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        city: 'NY'
        name: 'bar'
    }],
    thing: [{
        id: 14,
        name: 'foo'
    }, {
        id: 5,
        street: 'E43'
        name: 'pub'
    }]
};

Javascript对象(OBJ)我需要一个返回KEY值的方法如果OBJ方法中不存在KEY我作为参数传递应该返回未定义

getKeyValueFromObject(OBJ , 'street') // should return 'E43'
getKeyValueFromObject(OBJ , 'dog') // should return undefined

我试过这个(不工作)

getKeyValueFromObject(obj: any, search: string) {
    const notFound = {};
    Object.keys(obj).forEach(key => {
      if (key !== null && key !== undefined && !(obj[key] === undefined || obj[key] === null)) {
        if (key === search) {
          return obj[key];
        } else if (obj[key].constructor === {}.constructor) {
          const result = this.getKeyValueFromObject(obj[key], search);
          if (result !== notFound) return result;
        } else if (Array.isArray(obj[key])) {
          obj[key].forEach(element => {
            const result = this.getKeyValueFromObject(element, search);
            if (result !== notFound) return result;
          });

        }
      }
    });
    return {};
  }

标签: javascripttypescript

解决方案


您的代码几乎可以正常工作,但代码中的return语句forEach没有按预期工作。看这里:在 JavaScript 中获取返回值并摆脱 forEach?. 相反,我使用变量resultKey来存储匹配项。

您的 OBJ json 中缺少一些逗号,但我认为这不是主要问题。

var OBJ = {
    code: 42,
    item1: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        city: 'NY',
        name: 'bar'
    }],
    thing: [{
        id: 14,
        name: "foo"
    }, {
        id: 5,
        street: "E43",
        name: "pub"
    }]
};

function getKeyValueFromObject(obj, search) {
    let resultKey = undefined;
    const notFound = {};
    Object.keys(obj).forEach(key => {
      if (key !== null && key !== undefined && !(obj[key] === undefined || obj[key] === null)) {
        if (key === search) {
          resultKey = obj[key];
        } else if (obj[key].constructor === {}.constructor) {
          const result = this.getKeyValueFromObject(obj[key], search);
          if (result !== notFound) resultKey = result;
        } else if (Array.isArray(obj[key])) {
          obj[key].forEach(element => {
            const result = this.getKeyValueFromObject(element, search);
            if (result !== notFound) resultKey = result;
          });

        }
      }
      return;
    });
    return resultKey;
}
console.log(getKeyValueFromObject(OBJ, "street"));
console.log(getKeyValueFromObject(OBJ , "dog"));


推荐阅读