JavaScript从字符串值构建嵌套数组 [英] JavaScript build nested array from string values

查看:92
本文介绍了JavaScript从字符串值构建嵌套数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从我的数据源我得到的值如下;

From my data source I am getting values like;

USA        |Arizona
USA        |Florida
UK         |England |Northamptonshire
UK         |England |Derbyshire
UK         |Wales   |Powys
Switzerland|Lucern

这些是在列中重复的平面文本值。

These are flat text values that repeat in a column.

我需要动态地将它们构建到嵌套数组中

I need to build them dynamically into nested array

source: [
    {title: "USA",  children: [
      {title: "Arizona"},
      {title: "Florida"}
    ]}
  ],

根据 https://github.com/mar10/fancytree/wiki/TutorialLoadData

不幸的是我的大脑今天已经停止工作我看不到优雅的方式。

Unfortunately my brain has stopped working today I am can't see a elegant way.

任何指针都会是非常感谢。

Any pointers would be most gratefully appreciated.

所以我最终使用Oska的帖子解决了这个问题。 r

So I solved this eventually using a post from Oskar

function getNestedChildren(arr, parent) {
    var out = []
    for(var i in arr) {
        if(arr[i].parent == parent) {
            var children = getNestedChildren(arr, arr[i].id)

            if(children.length) {
                arr[i].children = children
            }
            out.push(arr[i])
        }
    }
    return out
}

http://oskarhane.com/create-a-nested- array-recursively-in-javascript /

这将构建嵌套数组。

确保推断值存在(例如美国属于层次结构,但不是唯一值。)

To ensure inferred values were present (e.g. USA which is in the hierarchy but is not a unique value).

		var CountryArray = CountryText.split("|");
	
		// Variables to hold details of each section of the Country path being iterated
		var CountryId = '';
		var CountryParentPrefix = '';
		var CountryParent = '';

		// Iterate each section of the delimeted Country path and ensure that it is in the array
		for(var i in CountryArray) 
		{

			var CountryId = CountryParentPrefix+CountryArray[i];
	
			// Find the Country id in the array / add if necessary
			var result = FlatSource.filter(function (Country) { return Country.id == CountryId });
			if (result.length == 0) {
					// If the Country is not there then we should add it
					var arrCountry = {title:CountryArray[i], parent:CountryParent, id:CountryId};
					FlatSource.push(arrCountry);
			}
			

			// For the next path of the heirarchy
			CountryParent = CountryId;
			CountryParentPrefix = CountryId+'|';
		}

我没有使用Sven的建议,但我怀疑它是同样有效。

I did not use Sven's suggestion but I suspect that it is equally valid.

推荐答案

将其转为JSON:

var str = '"USA|Arizona","USA|Florida","UK|LonelyIsland","UK|England|Northamptonshire","UK|England|Derbyshire","UK|Wales|Powys","UK|England|London|Soho","Switzerland|Lucern';

var jsonStr = "[[" + str.replace(/,/g,'],[') + "\"]]";
jsonStr = jsonStr.replace(/\|/g,'","');
var nested = JSON.parse(jsonStr);

然后与父母和孩子一起玩。

Then play with parents and children.

function findObject(array, key, value) {
    for (var i=0; i<array.length; i++) {
        if (array[i][key] === value) {
            return array[i];
        }
    }
    return null;
}

function obj(arr){
    this.title = arr.shift();
}

obj.prototype.addChild = function(arr){
    var tmp = new obj(arr);
    if(typeof this.children === 'undefined'){
        this.children = new Array();
        result = this.children[this.children.push(tmp)-1];
    }else{
        result = findObject(this.children, 'title', tmp.title);
        if(!result)
            result = this.children[this.children.push(tmp)-1];
    }
    return result;
}

obj.prototype.addChildren = function(arr){
    var obje = this;
    while(arr.length>0)
        obje = obje.addChild(arr);
}


var finArr = [];
for(i=0; i<nested.length; i++){
    var recc = new obj(nested[i]);
    if(oldObj = findObject(finArr, 'title', recc.title)){
        oldObj.addChildren(nested[i]);
    }else{
        if(nested[i].length>0)
                recc.addChildren(nested[i]);
        finArr.push(recc);        
    }
}

console.log('------------------------------------------')
console.log(JSON.stringify(finArr));
console.log('--------------------The End---------------')

这篇关于JavaScript从字符串值构建嵌套数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆