【发布时间】:2020-11-18 11:21:49
【问题描述】:
我想限制对象内扁平结构的数量。考虑下面的例子。
输入:
const exampleObj = {
foo: {
bar: {
biz: "hello"
}
}
};
输出:
{foo_bar_biz: "hello"}
我想设置一个限制器 (limit = 2),以便该函数将停止执行递归函数并返回类似的内容
{foo_bar: "[Object] object"}
这是一个sn-p:
const { useState, useEffect} = React;
const exampleObj = {
foo: {
bar: {
biz: "hello"
}
}
};
let limit = 0;
function App() {
const [state, setState] = useState({});
useEffect(() => {
flatten(exampleObj);
}, []);
const flatten = (data, parent, result = {}) => {
for (let key in data) {
const propName = parent ? parent + "_" + key : key;
if (typeof data[key] === "object") {
limit++;
if (limit <= 1) {
flatten(data[key], propName, result);
} else {
setState(prevState => {
return {
...prevState,
[propName]:
typeof data[key] === "object" ? "[Object] object" : data[key]
};
});
}
} else {
result[propName] = data[key];
setState({
...state,
[propName]: data[key]
});
}
}
};
console.log(state);
return (
<div>
<p>Start editing to see some magic happen :)</p>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>
我已经为此准备了一个解决方案,但这很麻烦。 https://stackblitz.com/edit/react-u5klvc
【问题讨论】:
-
请在此处添加相关代码。如果外部链接被删除或修改,问题将没有未来价值。你也可以创建a runnable stack snippet
-
或者如果访问者由于任何其他原因无法打开链接,比如它被阻止了。
-
啊抱歉,这个链接应该可以工作stackblitz.com/edit/react-td5w6j?file=src/App.js
-
这里的反应如何?这可能是一个关于数据结构和改变它们的简单问题?
-
也许这个例子会对你有所帮助。它将 flattening 从反应部分中分离出来。如果这与您尝试做的事情很接近,请告诉我。也许它需要一个答案。 codesandbox.io/s/gracious-galois-gyc0v?file=/src/App.js
标签: javascript reactjs recursion