const average = arr => arr.reduce((acc, n) => acc + n, 0) / arr.length;
const extractValues = (group, item, key) => item[key].forEach(n => ((group.values[n.id] ||= { id: n.id, name: n.name })[key] ||= []).push(n.value));
const result = Object
.values(arr
.flatMap(n => n.properties.groups)
.reduce((acc, n) => (
acc[n.id] ||= {
id: n.id,
name: n.name,
wellBeing: [],
values: {},
},
acc[n.id].wellBeing.push(n['well-being']),
extractValues(acc[n.id], n, 'needs'),
extractValues(acc[n.id], n, 'provision'),
acc
), {}))
.map(n => ({
id: n.id,
name: n.name,
value: average(n.wellBeing),
values: Object.values(n.values).map(m => (
m.needs = average(m.needs),
m.provision = average(m.provision),
m
))
}));
<body>
, а в обработчик передаёте нажатый элемент, распознаёте его, и, если был нажат нужный элемент - то делаете что-то дальше - фактически вешается один прослушиватель, никаких подвисонов, лагов и forEach для этого.document.querySelector('body').addEventListener('click', function(e) {
// e.target кликабельный элемент
// определяем, необходимый ли это эелемент
if(e.target && (e.target.className.search('needed-element')!== -1){
// тут работаем дальше с e.target или чем хотите
}
}
<?php
$results = [
['order_id' => 'first', 'id'=>1],
['order_id' => 'second', 'id'=>4],
['order_id' => 'third', 'id'=>7]
];
$filtered = array_filter(
$results,
function($el) {
return $el['id'] != 4;
}
);
var_export($filtered);
[XmlRoot(ElementName = "radiostation")]
public class Radiostation
{
[XmlElement(ElementName = "country")]
public string Country { get; set; }
[XmlElement(ElementName = "genre")]
public string Genre { get; set; }
[XmlElement(ElementName = "subgenre")]
public string Subgenre { get; set; }
[XmlElement(ElementName = "title")]
public string Title { get; set; }
[XmlElement(ElementName = "urlwww")]
public string Urlwww { get; set; }
[XmlElement(ElementName = "ico")]
public string Ico { get; set; }
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
}
[XmlRoot(ElementName = "users")]
public class Users
{
[XmlElement(ElementName = "radiostation")]
public Radiostation Radiostation { get; set; }
}
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
public class Questions
{
public string Question { get; set; }
public string Theme { get; set; }
public string Description { get; set; }
public string QuestionEn { get; set; }
public string DescrEn { get; set; }
}
const string FilePath = "sample.xls";
var qs = new List<Questions>();
using var stream = File.Open(FilePath, FileMode.Open, FileAccess.Read);
using var reader = ExcelReaderFactory.CreateReader(stream);
do
{
while (reader.Read())
{
var question = reader.GetString(0);
var theme = reader.GetString(1);
var description = reader.GetString(2);
qs.Add(new Questions()
{
Question = question,
Theme = theme,
Description = description
});
}
} while (reader.NextResult());
foreach(var q in qs)
{
Console.WriteLine($"{q.Question}");
Console.WriteLine($"{q.Theme}");
Console.WriteLine($"{q.Description}");
Console.WriteLine(new string('-', Console.WindowWidth));
}
Индейцы в знак примирения хлопали в ладоши
history
Они закапывали топор войны
----------------------------------------------------------------------------------------------------
Моряки пропитывали свою одежду смолой, чтобы она не рвалась
history
Чтобы она не пропускала воду
----------------------------------------------------------------------------------------------------
const str = "sdfASfsAFgbd1232b3b2j3b5b23hb5";
const sumNumbers = str.match(/\d+/g).join('').length;
const sumLetters = str.match(/[a-z]/gi).join('').length;
console.log(sumNumbers, sumLetters);