字符串数组到树数据结构?

array of strings to tree data structure?

有数据从服务器 return 编辑,包含一个字符串数组作为层次结构,如下所示:

var array = [
 "house.bedroom.bed",
 "house.kitchen.spoon",
 "house.kitchen.knife",
 "house.bedroom.sofa",
 "house.bedroom.tv",
 "plants.trees",
 "house.birds.parrot.grey"
 ]

我已经成功地制作了一个树状数据结构作为对象,以下面的树形式输出数据:

  house
    bedroom
      bed
      sofa
      tv
    kitchen
      spoon
      knife
    birds
      parrot
        grey
  plants
    trees

有什么方法可以选择字符串吗?例如被问到的“厨房”,我想 return 所有与该字符串相关的内容,如下所示:

house.kitchen.knife
house.kitchen.spoon

这是我学到的代码:

function find([key, values], string, temp = []) {
    var result;
    temp = temp.concat(key);
    if (key === string) {
        return temp.slice(1).join('.');
    }
    values.some(a => result = find(a, string, temp));
    return result;
}


var result = array.reduce((r, s) => {
        ('root.' + s).split('.').reduce((a, item) => {
            var array = a.find(([v]) => v === item);
            if (!array) {
                a.push(array = [item, []]);
            }
            return array[1];
        }, r);
        return r;
    }, []).pop();

console.log(find(result, 'kitchen'));
console.log(result);

我的输出是:

house.kitchen

我相信我明白你在问什么。我会用递归来解决这个问题。

function parse(items) {
   return items.reduce((acc, item) => {
      const k = item.slice(0, item.indexOf('.'))
      const v = item.slice(item.indexOf('.') + 1).split('.')
      
      const newItem = {
        [k]: v.length > 1 ? parse(v) : v
      }

      return Object.assign(acc, newItem)
   }, { })
}

这不是一个完整的解决方案,但应该可以理解总体思路。对于数组中的每个项目,将其拆分为一个键和一个值。键将是第一个 . 之前的字符串,而值为 . 之后的单个字符串或包含子对象的对象。

我建议过滤原数组

const data = ["house.bedroom.bed","house.kitchen.spoon", "house.kitchen.knife","house.bedroom.sofa","house.bedroom.tv",
 "plants.trees","house.birds.parrot.grey"];
 
 
 const result = data.filter((path) => path.split('.').includes('kitchen'));
 
 console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}