鉴于这两个字符串,
circle=false;
function activateInView(){
if(circle==false){
if( $('#myStat4').offset().top > $(window).scrollTop() ){
$('#myStat4').circliful();
circle=true; // this is so it doesn't keep activating as you keep scrolling
}
}
}
$(document).ready(function(){ //This fires when everything is loaded
activateInView(); //Test here in case it's already in view
$(window).scroll(function(){ // This checks again everytime you scroll
activateInView();
});
});
和
'1|100376|100377|100378'
我想创建一个如下所示的对象:
'1|100376|100377|100379|100380'
这是我的代码,
{
id:"1",
children: {
id:"100376",
children: {
id:"100377",
children: {
id:"100378",
children: {},
id: "100379",
children: {
id:"100380",
children: {}
}
}
}
}
}
这会生成正确的嵌套,但不会在键var tree = {};
var addTree = function(aggregateId){
if(aggregateId){
var arr = aggregateId.split('|'),
remainder = aggregateId.split('|').slice(1).join('|');
arr.reduce(function(node,id){
return node[id] || (node[id] = {});
}, tree);
}
};
addTree('1|100376|100377|100378');
addTree('1|100376|100377|100379|100380');
和id
下生成。我该怎么做呢?
children
答案 0 :(得分:1)
$ pip install sqlalchemy
但是,我认为您可能存在设计缺陷 - var tree = {};
var addTree = function(aggregateId) {
if (aggregateId) {
var arr = aggregateId.split('|'),
arr.reduce(function(node, id) {
if (!node.id) {
node.id = id;
node.children = {};
}
return node.children;
}, tree);
}
};
addTree('1|100376|100377|100378');
addTree('1|100376|100377|100379|100380');
console.log(JSON.stringify(tree));
// {"id":"1","children":
// {"id":"100376","children":
// {"id":"100377","children":
// {"id":"100379","children":
// {"id":"100380","children":{}}}}}}
只能容纳一个孩子。您确定不希望它是包含节点的数组,或者更好的是按照原始情况按键索引节点的对象吗?它适用于您的原始情况,因为您有从ids到儿童的映射;但在你提出的结构中,children
总是只有一个孩子。
编辑以了解更改后的要求:由于children
仍然无法正常使用,因此有点丑陋。可以使用Array.prototype.find
作为黑客攻击,但效率很低。所以:
.filter()[0]
答案 1 :(得分:1)
你已经到了一半。您需要做的就是对输出进行后处理以创建所需的表单,这就像
一样简单function makeTree(tree) {
if (!tree) return [];
return Object.keys(tree) . map(function(key) {
return { id: key, children: makeTree(tree[key]) };
});
}
这将输出一个结构,其中包含数组中的子项,如果有多个子项,则需要它,如另一张海报所指出的那样。输出是:
{
id:"1",
children: [
{
id:"100376",
children: [
{
id:"100377",
children: [
{
id:"100378",
children: []
},
{
id: "100379",
children: [
{
id:"100380",
children: []
}
]
}
]
}
]
}
]
}
以下用于构建中间表示的代码可能比您所写的更简洁:
function addTree(tree, input) {
function addNodes(node, ids) {
if (!ids.length) return; // exit recursion when done
var id = ids.shift(); // pick off next id
var subnode = node[id] = node[id] || { }; // find or create node
addNodes(subnode, ids); // recursively update
}
addNodes(tree, input.split('|'));
}
这种方法的工作方式是内部函数addNodes
使用数组node
中的ID更新ids
。它检查以确保有更多的ID要添加,然后选择第一个,查看相应的节点是否已经存在,如果没有创建一个,则将该id添加到该子节点。
继续对要处理的所有字符串调用addTree
。然后,进行后处理tree
以获得最终输出。
使用此:
> var input1 = '1|100376|100377|100378';
> var input2 = '1|100376|100379|100380';
> var tree = {};
> addTree(tree, input1) // add initial input
> tree
<"{
"1": {
"100376": {
"100377": {
"100378": {}
}
}
}
}"
> addTree(tree, input2) // add some more input
> tree
< "{
"1": {
"100376": {
"100377": {
"100378": {}
},
"100379": {
"100380": {}
}
}
}
}"
> makeTree(tree)
< "[
{
"id": "1",
"children": [
{
"id": "100376",
"children": [
{
"id": "100377",
"children": [
{
"id": "100378",
"children": []
}
]
},
{
"id": "100379",
"children": [
{
"id": "100380",
"children": []
}
]
}
]
}
]
}
]"
答案 2 :(得分:1)
您的问题描述中并不是很清楚。但是,如果您想要一种简单的方法来生成树,您只需要在管道字符(#include <string.h>
void functionCopyData(char buf[]){
char data1[] = "textdata1";
char data2[] = "textdata2";
strcpy(buf, data1);
strcpy(buf+strlen(buf), data2);
}
...
functionCopyData(variable);
...
)处拆分字符串,然后向后读取数组。
如果您想拥有多个孩子,可以轻松调整下面的逻辑,使"|"
成为一个数组。然后,您需要做的只是.children
而不是o.children.push(p)
。
由于无法在JavaScript中进行右缩减,因此您可以先reverse
在reduce
之前{{3}}数组
o.children = p