如何使用JavaScript中的地图功能迭代嵌套字典

时间:2019-06-04 06:27:58

标签: javascript

我正在尝试使用map迭代字典。但是我无法获取嵌套的字典属性。例如我需要其中的键value.type == string。有人可以帮我吗?

data.js

- set_fact:
    the_command: sh -c 'echo "The server is UP since `uptime`"'
- command: '{{ the_command }}'
- shell: '{{ the_command }}'

3 个答案:

答案 0 :(得分:2)

迭代此映射的最简单方法是按如下方式使用Object.keys()

var products_schema = {
    _id: {
        auto: true
    },
    product_name: {
        auto: false,
        type: "string",
        min: 5,
        max: 10,
        special_characters: ['_', ' '],
        numbers: true,
        alphabet: true,
        required: true,
        correct: ""
    },
    product_image: {
        auto: false,
        type: "array:string",
        min: 0,
        max: 50,
        required: true
    },
    product_specification: {
        auto: false,
        type: "array:specification_schema",
        min: 0,
        max: 50,
        required: true
    }
}
Object.keys(products_schema).forEach(key => console.log(products_schema[key].type));

答案 1 :(得分:2)

我不知道为什么需要使用Map对象,但是对于这种遍历对象的情况,您可以尝试使用旧的for..in循环,该循环遍历{{1}的可枚举属性}对象。

products_schema

答案 2 :(得分:0)

使用Map()并不总是最好的解决方案,尽管我不得不承认在您知道密钥名称很好的情况下,但是对地图内容有鸟瞰图是多一点参与。

在下面的演示中,我们将使用:

  1. objToMap(object):使用Object.entries()并在for...of循环内对结果进行解构。每次迭代都是一个简单的.set()。返回完整的地图。

  2. displayMap(Map):显示地图的所有路径,我们将使用两个for..of循环。外循环将处理Map的每个键/值。内部循环将处理从外部循环提取的值的每个键/值。

  3. getPath(Map, root, prop):第二个参数是Map键(例如'product_name')。第三个参数是第二个参数(例如“类型”)的对象内的键。用Map.get()找到第二个参数后,for...of将过滤Map.entries()的解构.filter()循环,并返回Object.fromEntries()的结果。

let products_schema = {
  _id: {
    auto: true
  },
  product_name: {
    auto: false,
    type: "string",
    min: 5,
    max: 10,
    special_characters: ['_', ' '],
    numbers: true,
    alphabet: true,
    required: true,
    correct: ""
  },
  product_image: {
    auto: false,
    type: "array:string",
    min: 0,
    max: 50,
    required: true
  },
  product_specification: {
    auto: false,
    type: "array:specification_schema",
    min: 0,
    max: 50,
    required: true
  }
}

function objToMap(obj) {
  let map = new Map();
  for (let [key, value] of Object.entries(obj)) {
    map.set(key, value);
  }
  return map;
}

let x = objToMap(products_schema);

// Display all map paths

function displayMap(Map) {
  for (let [key, value] of Map.entries()) {
    for (let [prop, val] of Object.entries(value)) {
      console.log(key + ': ' + prop + ': ' + val);
    }
  }
}

displayMap(x);

function getPath(Map, root, prop) {
  let level1 = Map.has(root) ? Map.get(root) : {};
  const filtered = Object.entries(level1)
    .filter(([key, value]) => key.includes(prop));
  return Object.fromEntries(filtered);
}

let y = getPath(x, 'product_name', 'type');
console.log(y);

// if root or prop is not found an empty object is returned
let z = getPath(x, 'product_name', 'foo');
console.log(z);