Если вы можете написать рекурсивную функцию, которая лучше всего подходит для производительности.
Но если вы хотите пропустить рекурсивный вызов с (для каждого ключа в вложенном объекте), вы можете попробовать JSON.parse
с дополнительным параметром (обратный вызов), который будет называться рекурсивно. как обобщенное решение, я добавляю фрагмент (с JSON.parse
, предполагая, что помощь в написании рекурсивной функции не должна быть принята / часть этого ответа).
Но помните, ЕСЛИ вы беспокоитесь о производительности эффективность вы не должны использовать это, поскольку вы должны стягивать (может быть большой объект) и снова анализировать. Но если у вас есть строка JSON, это должно быть одним из лучших решений.
var anyObject = [
{
"Attr": [
{
"power": { "p1": "str", "t3": "str" },
"light": [
{"test": "str"},
{"test2": [ { "t4": "str" }]}
]
}
]
},
{
"Attr1": [
{
"power1": { "p2": "str", "t5": "str" },
"light1": [
{ "test3": "str" },
{ "test_x": [
{ "t_x": "str" },
{ "t_y": [
{ "t_y1": "str" }
]
}
]
}
]
}
]
}
]
function getKeys(obj, str) {
let resultArr = [];
JSON.parse(JSON.stringify(obj), (key, val) => {
if(val === str) { resultArr.push(key) }
return val;
} )
return resultArr;
}
console.log(getKeys(anyObject, 'str'))
Это не зависит от конкретного случая, вы можете есть все ключи, если вы передадите другой обратный вызов в JSON.parse
, а также можете преобразовать объект с помощью этого (возвращаемое преобразованное значение вместо фактического значения)
И если вы хотите использовать lodash для повторного итерации объекта, то вы можете использовать _.cloneDeepWith
для рекурсивного итерации объекта.
Вот рабочий пример:
let anyObject = [
{
"Attr": [
{
"power": { "p1": "str", "t3": "str" },
"light": [
{"test": "str"},
{"test2": [ { "t4": "str" }]}
]
}
]
},
{
"Attr1": [
{
"power1": { "p2": "str", "t5": "str" },
"light1": [
{ "test3": "str" },
{ "test_x": [
{ "t_x": "str" },
{ "t_y": [
{ "t_y1": "str" }
]
}
]
}
]
}
]
}
];
function getKeys(obj, str) {
let resultArr = [];
_.cloneDeepWith(obj, (value, key) => { value === 'str' && resultArr.push(key)});
return resultArr;
}
console.log(getKeys(anyObject, 'str'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Питонская черепаха не является демоном скорости, когда дело доходит до анимации. Хитрость в том, чтобы добиться какой-то скорости, - это потратить время, чтобы понять, как это работает, и попросить его сделать как можно меньше. Ниже приведена моя реализация анимированного GIF-изображения «каждый из белых кругов действительно движется»:
from math import pi, cos
from itertools import cycle
from turtle import Screen, Turtle
CIRCLES = 8
DIAMETER = 300
RADIUS = DIAMETER / 2
CURSOR_SIZE = 20
screen = Screen()
screen.tracer(False)
turtle = Turtle(visible=False)
turtle.dot(DIAMETER + CURSOR_SIZE)
turtles = []
for n in range(CIRCLES):
angle = n * pi / CIRCLES
circle = Turtle('circle')
circle.radians()
circle.color('red')
circle.penup()
circle.setheading(angle) # this stays fixed
# stash a couple of our values with the turtle
circle.angle = angle # this will change
circle.sign = 1 if cos(angle) > 0 else -1
turtles.append(circle)
circles = cycle(turtles)
while True: # really should use timer event but we're going for maximum speed!
circle = next(circles)
cosine = cos(circle.angle)
circle.forward(cosine * RADIUS - circle.sign * circle.distance(0, 0))
# update the values we stashed with the turtle
circle.sign = 1 if cosine > 0 else -1
circle.angle -= 0.1
screen.update()
screen.tracer(True)
screen.mainloop()
Если вы хотите увидеть линии, на которых круги движутся взад-вперед, добавьте следующий код непосредственно перед строкой turtles = []
:
turtle.radians()
turtle.color('white')
for n in range(CIRCLES):
turtle.setheading(n * pi / CIRCLES)
turtle.forward(RADIUS)
turtle.backward(DIAMETER)
turtle.forward(RADIUS)