我正在尝试使用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 }}'
答案 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)
答案 2 :(得分:0)
使用Map()
并不总是最好的解决方案,尽管我不得不承认在您知道密钥名称很好的情况下,但是对地图内容有鸟瞰图是多一点参与。
在下面的演示中,我们将使用:
objToMap(object)
:使用Object.entries()
并在for...of
循环内对结果进行解构。每次迭代都是一个简单的.set()
。返回完整的地图。
displayMap(Map)
:显示地图的所有路径,我们将使用两个for..of
循环。外循环将处理Map的每个键/值。内部循环将处理从外部循环提取的值的每个键/值。
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);