Как проверить, есть ли хотя бы один вложенный объект с определенным URL? - PullRequest
1 голос
/ 19 апреля 2019

Итак, вот POJO:

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
}

Я бы хотел, чтобы оператор if выполнял что-то вроде:

if (there is at least one nested object with a "url") { 
  $('body').append("<div>" + url +"</div>");
}

Так что конечный результат должен быть:

(HTML)

<body>
  <div>stackoverflow.com</div>
  <div>example.com</div>
</body>

Если вы не поняли мой вопрос, пожалуйста, скажите мне, и я постараюсь объяснить его лучше.

Для ответов, которые сработали, я сказал «это работает» или «это сработало» где-то в комментариях, чтобы люди, просматривающие этот вопрос, могли легко найти свой ответ.

Ответы [ 6 ]

2 голосов
/ 19 апреля 2019

Вы можете использовать Set, чтобы получить уникальные ссылки и добавить их к body

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
}

const urls =  Object.values(foodwebsites)
                    .flat()
                    .reduce((set, a) => a.url ? set.add(a.url) : set, new Set)

for (let url of urls) { 
  $('body').append("<div>" + url +"</div>");
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body> </body>
2 голосов
/ 19 апреля 2019

Используйте Object.values, filter и map для получения URL-адресов, затем разместите их на странице с помощью forEach:

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
};

var urls = [...new Set(Object.values(foodwebsites).filter(item => item.some(({ url }) => url)).map(item => item.map(({ url }) => url)).reduce((acc, curr) => acc.concat(curr)))];

urls.forEach(url => document.body.innerHTML += `<div>${url}</div>`);
2 голосов
/ 19 апреля 2019

Если вы хотите извлечь все уникальные URL, вы можете использовать Object.values, чтобы преобразовать объект в массив.Используйте Set и flatMap, чтобы получить уникальные значения.

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }, {
    "url": "example2.com",
  }]
}

var result = [...new Set(Object.values(foodwebsites).flatMap(o => o.map(v => v.url))).values()]


//Loop thru the result array and append it to body
result.forEach(function(o) {
  $("body").append("<div>" + o + "</div>");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Если вы хотите проверить, включен ли определенный объект в объект, вы можете использовать Object.values для преобразования объекта вмассив.UEE some для проверки URL элемента 0.

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{                    //2 URLS for cheese
    "url": "example.com",
  }, {
    "url": "example2.com",
  }]
}

var result = Object.values(foodwebsites).some(o => o.some(v => v.url === "example2.com"))

console.log(result);
1 голос
/ 19 апреля 2019

Попробуйте этот код:

let urls = Object.values(foodwebsites).reduce((prev, item) => prev += item[0].url ? `<div>${item[0].url}<div>` : "", "");
    if(urls !== "")$('body').append("<div>" + urls +"</div>");
0 голосов
/ 19 апреля 2019

Немного опоздал на вечеринку, но вот мой подход.

Учитывая:

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
}

const result = Object.values(foodwebsites)
      .flatMap((item)=>{return item})
      .map((item)=>{return item.url})
      .reduce((collection,item)=>{if (collection.indexOf(item) < 0) collection.push(item); return collection}, []);

// Outputs: ["stackoverflow.com", "example.com"]

И поскольку мы используем оператор flatMap, тот же код будет безопасен для следующего:

 var foodwebsites = {
  "bacon": [
  {"url": "stackoverflow.com"},
  {"url":"another.com"}],

  "icecream": [
  {"url": "example.com"}],

  "cheese": [
  {"url": "example.com"},
  {"url": "stackoverflow.com"}]
}

//Output: ["stackoverflow.com", "another.com", "example.com"]

Тогда:

result.forEach((url)=>{$('body').append("<div>" + url +"</div>");})

Дополнительные показания:

https://gists.cwidanage.com/2018/06/how-to-iterate-over-object-entries-in.html

Удалить дублирующиеся значения из массива JS

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap

0 голосов
/ 19 апреля 2019

Вы можете использовать array.some

Если во вложенном массиве будет только один объект

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
}

const ifUrl = Object.values(foodwebsites).some(values => values[0] && values[0].url === 'example.com')

console.log(ifUrl)

Если во вложенном массиве может быть несколько номеров элементов, и любой может иметь URL-адрес ключа

var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
}

const ifUrl = Object.values(foodwebsites).some(values => values.some(v => v.url === 'example.com'))

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