Как перебрать массив объектов для поиска ключевых значений, включающих одинаковые слова-Javascript - PullRequest
0 голосов
/ 18 октября 2019

У меня есть массив объектов с текстовыми именами

array= [{
  text:"ABC",
  someobj:{}
  length: 3
 },{
  text:"XYZ",
  someobj:{},
  length: 4
 },{
  text:"TES",
  someobj:{},
  length: 2
 },{
  text:"ABC_VALUE",
  someobj:{},length: 3
 },{
  text:"TES_VALUE",
  someobj:{},length: 10
 },{
  text:"SME",
  someobj:{},length: 39
 },{
  text:"SME_VALUE",
  someobj:{}, length: 1
 }
]

Как вы можете видеть, у меня есть _VALUE в некоторых текстовых именах. Я пытаюсь получить общую длину всех совпадающих значений, то есть длину "ABC" + длину "ABC_VALUE" (6), аналогично длине "SME_VALUE" + длину "SME" (40).

Я пробовал с переключателем case и if condition.

function getVlaues(obj)
let length=0;
    else if(obj.text.includes("SME")) {length += obj.length;}
    else if (obj.text.includes("ABC")) {length += obj.length;}
    else if (obj.text.includes("TES")) {length += obj.length;}

    return length;
}

, но это не возвращает мне общую длину 2 объекта. есть идеи как это сделать?

1 Ответ

2 голосов
/ 18 октября 2019

Вы можете разделить текст на _ и использовать первое значение в качестве ключа и рассчитать длину для каждого ключа

let array = [{text: "ABC",someobj: {},length: 3}, {text: "XYZ",someobj: {},length: 4}, {text: "TES",someobj: {},length: 2}, {text: "ABC_VALUE",someobj: {},length: 3}, {text: "TES_VALUE",someobj: {},length: 10}, {text: "SME",someobj: {},length: 39}, {text: "SME_VALUE",someobj: {},length: 1}]

let final = array.reduce((op, inp) => {
  let text = inp.text.split('_', 1)[0]
  op[text] = op[text] || 0
  op[text] += inp.length
  return op
}, {})

console.log(final)

Или, если вы уверены, что text отличается только на _value в конце, вы можете заменить эту часть и использовать в качестве ключа

let array = [{text: "ABC",someobj: {},length: 3}, {text: "XYZ",someobj: {},length: 4}, {text: "TES",someobj: {},length: 2}, {text: "ABC_VALUE",someobj: {},length: 3}, {text: "TES_VALUE",someobj: {},length: 10}, {text: "SME",someobj: {},length: 39}, {text: "SME_VALUE",someobj: {},length: 1}]

let final = array.reduce((op, inp) => {
  let text = inp.text.replace(/_value$/gi,'')
  op[text] = op[text] || 0
  op[text] += inp.length
  return op
}, {})

console.log(final)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...