首页 > 解决方案 > 从对象中获取一个值并使用该值在某个条件下填充同一对象中的其他键

问题描述

所以这里有一个例子:

{
    "part": "Intro",
    "e": "------5/6------8\\6-|-------------------|-------------------",
    "B": "-----------9-------|---------6p8---(6)-|-------------------",
    "G": "--8----------------|---8h9-------------|--<8>--------------",
    "D": "",
    "A": "",
    "E": "",
    "endMsg": "Continue..."
}

注意:斜杠只有在呈现文本时才会变成一个斜杠。

  1. 我想从这个不为空的对象中获取值。(所以这可能来自e钥匙或B钥匙。只要它不是空的。)

  2. 然后我在这里使用这个表达式替换那个值:

    str.replace(/[0-9-.a-zA-Z // \ ~ ( ) < >]/g, '-');

它用于将数字、字母和其他字符替换为破折号。

  1. 我想将该值与破折号和管道字符一起使用,只是为了填充同一对象内的其他空键。
  2. 最后,我希望它看起来像这样:
{
   "part": "Intro",
   "e": "------5/6------8\\6-|-------------------|-------------------",
   "B": "-----------9-------|---------6p8---(6)-|-------------------",
   "G": "--8----------------|---8h9-------------|--<8>--------------",
   "D": "-------------------|-------------------|-------------------",
   "A": "-------------------|-------------------|-------------------",
   "E": "-------------------|-------------------|-------------------",
   "endMsg": "Continue..."
}

我不知道如何在代码中实现这一点。请帮忙。

标签: javascriptobject

解决方案


您可以遍历每个键值对并在其为空时替换该值。请注意,反斜杠用于转义字符。为了解决这个问题,我们首先用破折号替换反斜杠,然后替换其余部分。

正则表达式也可以简化为/[^-|]/g这意味着替换所有符号,除了-|

const lines = {
    "part": "Intro",
    "e": "------5/6-----8\\6-|-------------------|-------------------",
    "B": "-----------9-------|---------6p8---(6)-|-------------------",
    "G": "--8----------------|---8h9-------------|--<8>--------------",
    "D": "",
    "A": "",
    "E": "",
    "endMsg": "Continue..."
};

const createFullLines = (lines, blacklist = ['part', 'endMsg']) => {
  // Find a line that is not empty
  const line = Object.entries(lines).find(([key, line]) => {
    return !blacklist.includes(key) && line.trim();
  });
  
  // Exit if all lines are empty
  if(!line) return lines;
  
  // Destructure to get only value
  const [_, filledLine] = line;
  
  // Create new line with only dashes
  const newLine = filledLine.replace(/[^-|]/g, '-');
  
  // Update lines
  for(const key in lines) {
    lines[key] ||= newLine;
  }
  
  return lines;
}

const result = createFullLines(lines);

console.log(result);


推荐阅读