Цикл по объекту JavaScript и добавление строки в конец, если не последний элемент - PullRequest
0 голосов
/ 22 ноября 2018
{
field_country: ["England", "Netherlands", "India", "Italy"],
field_continent: ["Europe"],
field_group: ["Building", "People", "Landscape"
}

Я хочу перебрать каждый элемент и вернуть ключ и массив вместе с окончанием «ИЛИ», например: field_country: «Англия» ИЛИ field_country: «Нидерланды» Последний элемент не должен заканчиваться на «ИЛИ»в петле.Я не уверен, что лучший процесс для этого с использованием Vanilla JS.Пока мой код выглядит следующим образом:

Object.keys(facets).forEach(function(facetKey) {
  if (facets[facetKey].length > 1) {
    facetResults = facets[facetKey];
    for (var i = 0; i < facetResults.length; i ++) {
      if (i == 1) {
        filter = "'" + facetKey + "'" + ":'" + facetResults[i] + " OR";
        return filter;
      } else {
        filter = "'" + facetKey + "'" + ":'" + facetResults[i];
      }
   }
} else {
  filter = "'" + facetKey + "'" + ": " + facets[facetKey] + "'";
  return filter;
}
});

Буду очень признателен за любую помощь.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете сделать что-то подобное с Object.entries и Array.reduce, если вы хотите получить окончательный результат в виде объекта:

const data = { field_country: ["England", "Netherlands", "India", "Italy"], field_continent: ["Europe"], field_group: ["Building", "People", "Landscape"] }

const result = Object.entries(data).reduce((r, [k, v]) => {
  r[k] = v.join(' OR ')
  return r
}, {})

console.log(result)

Несколько неясно, какой конечный формат вам нужен, но это должно помочь вам понять идею.Если ES6 не вариант, вы можете преобразовать это в:

const result = Object.entries(data).reduce(function(r, [k, v]) {
   r[k] = v.join(' OR ')
   return r
}, {})

Таким образом, нет arrow function и т. Д.

Идея состоит в том, чтобы получить массивы в массивы строк ииспользуйте Array.join, чтобы сделать «замену» для вас через join(' OR ')

0 голосов
/ 22 ноября 2018

Вот идея.В вашем коде вы добавляете «или» в конце ваших строк, начиная с индекса 0. Я предлагаю вам добавить его в начале, начиная с индекса 1.

var somewords = ["ORANGE", "GREEN", "BLUE", "WHITE" ];
var retval = somewords[0];
for(var i = 1; i< somewords.length; i++)
  {
    retval += " or " + somewords[i];
  }
console.log(retval);

//result is: ORANGE or GREEN or BLUE or WHITE
0 голосов
/ 22 ноября 2018

Ваше условное выражение if (i == 1) будет срабатывать только на второй итерации цикла, поскольку i будет равняться 1 только один раз.

Попробуйте что-то вроде:

if (i < (facetResults.length - 1)) {
    // only add OR if this isn't the last element of the array
    filter = "'" + facetKey + "'" + ":'" + facetResults[i] + " OR";
    return filter;
}

Вот ваш обновленный код:

Object.keys(facets).forEach(function(facetKey) {
  if (facets[facetKey].length > 1) {
    facetResults = facets[facetKey];
    for (var i = 0; i < facetResults.length; i ++) {
      if (i < (facetResults.length - 1)) {
        filter = "'" + facetKey + "'" + ":'" + facetResults[i] + " OR";
        return filter;
      } else {
        filter = "'" + facetKey + "'" + ":'" + facetResults[i];
      }
   }
} else {
  filter = "'" + facetKey + "'" + ": " + facets[facetKey] + "'";
  return filter;
}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...