Как исключить ключи из карты и отображать только значения? - PullRequest
0 голосов
/ 01 августа 2020

У меня есть Object obj, как показано ниже:

const obj = {
         Hostname: "abc"
         id: 189883
         message: "error message"
         name: "script name"
};
  1. Я хочу исключить ключ Hostname и его значение.
  2. Я хочу только захватите values исключая keys, чтобы результат выглядел следующим образом: 189883:error message:script name

Окончательный результат должен быть string. Я написал следующий код, но он создает элемент массива для каждой буквы

const resultObj = Object.values(vascoResponse.rows[0]obj).map((row) =>
  Object.values(row).filter((val) => val)
);

Ответы [ 5 ]

2 голосов
/ 01 августа 2020

Вы можете захватить записи вашего объекта, чтобы получить массив из [[key, value], [key2, value2], ...] пар. Затем вы можете использовать на нем .filter(), чтобы удалить пару с ключом "Hostname". Наконец, вы можете сопоставить каждый внутренний массив с его значением и использовать .join(":") для получения строки:

const obj = {
   Hostname: "abc",
   id: 189883,
   message: "error message",
   name: "script name"
};

const res = Object.entries(obj)
             .filter(([key]) => key !== "Hostname")
             .map(([,v]) => v).join(":");

console.log(res);

Если вам нужно, чтобы эта функция была извлечена в функцию, вы можете деструктурировать аргумент объекта, чтобы получить все ключи / значения, кроме Hostname, а затем захватить и присоединиться значения, основанные на этом:

const obj = {
   Hostname: "abc",
   id: 189883,
   message: "error message",
   name: "script name"
};

const getString = ({Hostname, ...r}) => Object.values(r).join(':');
console.log(getString(obj));
1 голос
/ 01 августа 2020

Итак, я понимаю, к чему вы клоните, но лично я бы вообще избегал Object.values(). Как правило, решая, что делать с массивом, я пытаюсь задать следующие вопросы:

  • Я хочу извлечь подмножество значений из объекта на основе ключей? -> используйте Object.keys() для фильтрации
  • Я хочу извлечь из объекта подмножество значений на основе значений? -> используйте Object.values()
  • Я хочу превратить один массив в другой такой же длины? -> используйте array.map()
  • Я хочу превратить один массив в более короткий массив? -> используйте array.filter()
  • Хочу ли я преобразовать массив в одно значение, например строку? -> используйте array.reduce()

Поскольку вам нужно подмножество значений из объекта на основе ключей, и вы хотите превратить его в строку, тогда нам, вероятно, следует использовать Object.keys(), array.filter(), а затем array.reduce() вот так:

let obj = {
   Hostname: "abc",
   id: 189883,
   message: "error message",
   name: "script name"
};

let resultString = Object.keys(obj) //gets an array of keys from the object
  .filter(key => key != "Hostname") //removes 'Hostname' from the array
  .reduce((accumulator, key) => 
    accumulator == "" ? accumulator + obj[key] : accumulator + ":" + obj[key],
   "");

console.log(resultString);

Если вы запустите этот фрагмент кода, вы обнаружите, что он выводит строку точно так, как вы надеялись каждый раз. Тернарный оператор внутри редуктора - это просто хитрый способ добавления символа двоеточия ":" перед каждым новым значением, если оно не является первым.

1 голос
/ 01 августа 2020

const obj = {
     Hostname: "abc",
     id: 189883,
     message: "error message",
     name: "script name"
};

let str=Object.entries(obj)
 .filter(([k])=>k!=="Hostname")
 .map(([k,v])=>v).join(":");
console.log(str)
1 голос
/ 01 августа 2020

Используйте Object.values()

const objec = {
  Hostname: "abc",
  id: 189883,
  message: "error message",
  name: "script name"
};
res = Object.values(objec).filter((o,i) => o != "abc" ).join(":")
console.log(res)
0 голосов
/ 01 августа 2020

Вы можете использовать delete и Object.values.

delete obj["Hostname"];
Object.values(obj).join(":");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...