第 152 题:实现一个 normalize 函数,能将输入的特定的字符串转化为特定的结构化数据

发布于 2022-07-18 18:37:30 字数 259 浏览 180 评论 16

字符串仅由小写字母和 [] 组成,且字符串不会包含多余的空格。

示例一:

'abc' --> {value: 'abc'}

示例二:

'[abc[bcd[def]]]' --> {value: 'abc', children: {
value: 'bcd', children: {value: 'def'}}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

反差帅 2022-05-04 13:54:05
 return (obj.children = {})

return (obj.children = {}) 这个啥意思 呀 还是看不懂 为啥

简化一下代码,你可以这么理解:

const normalize = (str) => {
  var result = {};
  str
    .split(/[[]]/g)
    .filter(Boolean)
    .reduce((obj, item) => {
      obj.value = item;
      let children = {};
      obj.children = children;
      return children;
    }, result);
  return result;
};

代码写的6,顶一个,但是用这种极简的骚操作写法是为了减少代码量么,可读性不考虑么

喜爱纠缠 2022-05-04 13:53:59
 return (obj.children = {})

return (obj.children = {}) 这个啥意思 呀 还是看不懂 为啥

简化一下代码,你可以这么理解:

const normalize = (str) => {
  var result = {};
  str
    .split(/[[]]/g)
    .filter(Boolean)
    .reduce((obj, item) => {
      obj.value = item;
      let children = {};
      obj.children = children;
      return children;
    }, result);
  return result;
};
Smile简单爱 2022-05-04 13:53:58
 return (obj.children = {})

return (obj.children = {}) 这个啥意思 呀 还是看不懂 为啥

夜司空 2022-05-04 13:53:51
function normalize(s) {
    let arr = s.match(/w+/g)
    let result
    while(arr.length) {
        let cur = arr.pop()
        let temp = {value: cur}
        if(result) {
            temp.children = result
        }
        result = temp
    }
    return result
}


// 测试
var s = 'abc'
normalize(s) // {value: "abc"}

s = '[abc[bcd[def]]]'
normalize(s) 
// {value: 'abc', children: {value: 'bcd', children: {value: 'def'}}}

更过编程算法题可见 JavaScript-Algorithms

十秒萌定你 2022-05-04 13:53:50
function normalize(str) {
      const list = str.match(/w+/g)
      function fn(list) {
        if(list.length === 1){
          return {
            value: list[0]
          }
        }
        let res = {}
        const item = list.shift();
        res = {
          value: item,
          children: fn(list)
        }
        return res
      }
      return fn(list)
 }
丶视觉 2022-05-04 13:53:50
var str = '[abc[bcd[def]]]';
console.log(fn(str));
function fn(strs) {
	var arr = strs.replace('[', '').replace(/]/g, '').split('[');
	// console.log('arr: ', arr);
	var res = {};
	var pointer = res;
	for (var i = 0; i < arr.length; i ++) {
		pointer.value = arr[i];
		if (i < arr.length - 1) {
			pointer.children = {};
			pointer = pointer.children;
		}
	}
	return res;
}
垂暮老矣 2022-05-04 13:53:19
function normalize(str) {
  let current, result;
  while (current = str.match(/[([a-z]+)]/)) {
    let [res, value] = current;
    result = result ? { value, children: result } : { value };
    str = str.replace(res, '');
  }
  if (!result) result = {value: str};
  return result;
}
梦言归人 2022-05-04 13:49:46
function normalize(str) {
  if (!str) return {};
  const arr = str
    .split(/[[]]/g)
    .filter(Boolean)
    .reverse();
  return arr.reduce((acc, cur) => {
    const temp = {};
    if (acc.value) { //说明此时acc !== {}
      temp.children = acc;
    }
    temp.value = cur;
    return temp;
  }, {});
}
酒几许 2022-05-04 13:46:37
function normalize(str, res = {}) {
  if (str) {
    if (str[0] === "[") {
      const exec = /^[(w+)([.*]){0,1}]$/.exec(str);
      if (exec) {
        const [, value, next] = exec;
        res.value = value;
        next && normalize(next, (res.children = {}));
      }
    } else if (!/([|])/.test(str)) {
      res.value = str;
    }
  }
  return res;
}

// 测试用例
[
  "[a[b[c]]]",
  "",
  "asd",
  "[aads",
  "asdasd]",
  "[asddd]",
  "[a[d]",
  "[s[]]"
].reduce((acc, c) => ((acc[c] = normalize(c)), acc), {});

es5、纯算法:

function normalize(str) {
  if (!/([|])/.test(str)) {
    return { value: str };
  }
  var len = str.length,
    quene = [],
    res = {},
    ret = res,
    current = "";
  for (var i = 0; i < len; i++) {
    var c = str[i];
    if (c === "[" || c === "]") {
      if (current) {
        quene.push(current);
        current = "";
      }
      if (c === "]") {
        var top = quene.shift();
        if (top) {
          res.value = top;
          if (quene.length) {
            res = res.children || (res.children = {});
          }
        }
      }
    } else {
      current += c;
    }
  }
  return ret;
}
南冥有猫 2022-05-04 13:13:47
let normalize = (str) => {
    let arr = str.split(/[[]]/).filter(Boolean);
    let i = 0, obj = {}, cur = obj;
    while(i < arr.length) {
        if (i > 0) cur = cur.children = {};
        cur.value = arr[i];
        i ++;
    }

    return obj;
}
晚风撩人 2022-05-04 13:09:25

字符串仅由小写字母和 [] 组成,且字符串不会包含多余的空格。
示例一: 'abc' --> {value: 'abc'}
示例二:'[abc[bcd[def]]]' --> {value: 'abc', children: {value: 'bcd', children: {value: 'def'}}}

打小就很酷 2022-05-04 12:57:21
var normalize = (str) => {
  var list = str.match(/w+/g)
  var obj = {}
  var curr = obj
  while (key = list.shift()) {
      curr.value = key
      if (list.length === 0) break
      curr.children = {}
      curr = curr.children
  }
  return obj
}
梦屿孤独相伴i 2022-05-04 12:45:08
const normalize = str => {
  const arr = str.split(/[[]]/).filter(Boolean);
  const createArr = arr => {
    return arr.reduce((obj, val, n, arr) => {
      arr.length > 1 ? (obj.children = createArr(arr.slice(1))) : "";
      obj.value = arr[0];
      return obj;
    }, {});
  };
  return createArr(arr);
};
半暖夏伤 2022-05-04 12:09:14
function normalize(str) {
	let arr = str.match(/w+/g)
	let temp = {}
	let obj
	while(arr.length) {
		let item = arr.pop()
		temp.value = item
		obj && (temp.children = obj)
		if(arr.length) {
			obj = {...temp}
			temp = {}
		}else {
			obj = temp
		}
	}
	return obj
}
黯然 2022-05-04 11:41:22
const normalize = (str) => {
  var result = {}
  str.split(/[[]]/g).filter(Boolean).reduce((obj, item, index, a) => {
    obj.value = item
    if(index !== a.length -1) {
      return (obj.children = {})
    }
  }, result)
  return result
}
千纸鹤 2022-05-04 10:04:26
let normalize = str => {
  let result = {}
  let c
  
  // 字符串转化为数组
  let arr = str.split(/[[]]/g).filter(Boolean)
  
  // 生成结构化数据
  arr.forEach((item, index) => {
    if(index != 0) {
      c.children = {}
      c.children.value = item
      c= c.children
    } else {
      result.value = item
      c= result
    }
  })
  
  return result
}
let str = '[abc[bcd[def]]]'
normalize(str)
// {value: 'abc', children: {value: 'bcd', children: {value: 'def'}}}
~没有更多了~

关于作者

放手`

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

1CH1MKgiKxn9p

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

JackDx

文章 0 评论 0

信远

文章 0 评论 0

yaoduoduo1995

文章 0 评论 0

霞映澄塘

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文