【问题标题】:Get value from object using 'Array Path'使用“数组路径”从对象中获取值
【发布时间】:2022-01-18 03:50:15
【问题描述】:

我需要使用在字符串数组中定义的路径从记录中提取值。我想出了以下解决方案。它可以工作,但在我看来,这段代码似乎有点太复杂而难以理解。我想知道是否有更好的方法来检查一个值是否是原始类型,以及是否有人可以用更简单的方式思考来完成这项工作。

const record = {
    firstName: "Joe Doe",
    personalData: {
        email: "joe.doe@test.com"            
    }
};
const path = ["personalData","email"];

const getJsonValueUsingPath = (record, path, index) => {
  const isPrimitiveType =
    Object(record[path[index]]) !== record[path[index]];
  if (isPrimitiveType) {
    return record[path[index]];
  } else {
    return getColumnValue(record[path[index]], path, index + 1);
  }
};
    

我需要这个功能,因为我正在使用需要这种功能的第三方库。请不要说使用字符串数组提取对象属性值是个坏主意。

【问题讨论】:

  • “不要说提取 JSON 值是个坏主意……”:不,但是调用是个坏主意> 这个 JSON。请...阅读json标签的使用说明。这与 JSON 无关。您的问题中没有 JSON。我从你的问题中删除了它。
  • 可以像const query = (ps) => (obj) => ps .reduce ((a, p) => (a || {}) [p], obj)一样简单。

标签: javascript arrays algorithm


【解决方案1】:

为简化起见,您可以删除原始检查并假设路径是正确的并导致需要返回的值,无论它是否是原始的。

其次,您可以将循环替换为路径上的reduce() 调用。

const getValueUsingPath = (record, path) => 
    path.reduce((record, item) => record[item], record);

const record = {
    firstName: "Joe Doe",
    personalData: {
        email: "joe.doe@test.com"            
    }
};
const path = ["personalData","email"];

console.log(getValueUsingPath(record, path));

【讨论】:

    【解决方案2】:

    不确定这是否是您所追求的。这只是对您所拥有的内容的一点更新,但它提供了一种检测原语的替代方法

    const record = {
      firstName: "Joe Doe",
      personalData: {
        email: "joe.doe@test.com"
      }
    };
    const path = ["firstName", "personalData", "email"];
    
    let primitives = ['string', 'number', 'bigint', 'boolean', 'undefined', 'symbol', 'null'];
    
    const getJsonValueUsingPath = (rec, pa, index) => {
      let item = rec[pa[index]];
      //console.log(typeof item)
      return primitives.includes((typeof item).toLowerCase()) ? item : getJsonValueUsingPath(item, path, index + 1)
    }
    
    console.log(getJsonValueUsingPath(record, path, 0));
    console.log(getJsonValueUsingPath(record, path, 1));

    【讨论】:

      【解决方案3】:

      lodash 如果您不介意:

      const _ = require('lodash');
      const record = { firstName: "Joe Doe", personalData: { email: "joe.doe@test.com" } };
      const path = ["personalData","email"];
      
      _.get(record, path); // 'joe.doe@test.com'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多