const merge = (...arrs) =>
Array.from(
{ length: Math.max(...arrs.map(n => n.length)) },
(_, i) => Object.assign({}, ...arrs.map(n => n[i]))
);
const arr = merge(arr1, arr2);
const merge = (...arrs) =>
arrs.reduce((acc, n) => (
n.forEach((m, i) => Object.assign(acc[i] ??= {}, m)),
acc
), []);
const arr = [
{ id0: 200, sum0: 1000 },
{ id0: 200, sum0: 1000 },
{ id0: 200, sum0: 1000 },
{ id0: 200, sum0: 1000 },
{ id10: 300, sum300: 1500 },
{ id10: 300, sum300: 1500 },
{ id10: 300, sum300: 1500 },
];
const calc = arr.reduce(
(acc, current) => {
const key = Object.keys(current).find((key) => key.startsWith("id"));
acc[key] ? acc[key]++ : (acc[key] = 1);
if (acc[key] > acc.result.count) acc.result = { id: key, count: acc[key] };
return acc;
},
{ result: { id: null, count: 0 } }
);
console.log(calc.result)
const merge = (key, ...arrs) =>
Object.values(arrs.flat().reduce((acc, n) => (
Object.assign(acc[n[key]] ??= {}, n),
acc
), {}));
const result = merge('id', sum, arr1, arr2);
const merge = (key, ...arrs) =>
Array.from(arrs.reduce((acc, arr) => arr.reduce((acc, n) => {
const k = key(n);
return acc.set(k, Object.assign(acc.get(k) ?? {}, n));
}, acc), new Map).values());
const result = merge(n => n.id, sum, arr1, arr2);
const result = arr.map(function(n) {
return this[n];
}, Object.fromEntries(sum.map(n => [ n.id, n.name ])));
// или
const names = new Map(sum.map(n => [ n.id, n.name ]));
const result = arr.map(n => names.get(n));
// или
const result = arr.map(n => sum.find(m => m.id === n)?.name);
sum
отсутствуют некоторые из нужных элементов, а получать undefined
внутри массива с результатами не хочется?const result = arr.map(function(n) {
return this[n] ?? 'объекта с таким id нет';
}, Object.fromEntries(sum.map(n => [ n.id, n.name ])));
const names = new Map(sum.map(n => [ n.id, n.name ]));
const result = arr.reduce((acc, n) => (names.has(n) && acc.push(names.get(n)), acc), []);
const newArr = arr.reduce((acc, n) => (
acc.push({ ...n, fractionTotal: n.fraction + (acc.at(-1)?.fractionTotal ?? 0) }),
acc
), []);
// или
const newArr = arr.map(function({ ...n }) {
n.fractionTotal = this[0] += n.fraction;
return n;
}, [ 0 ]);
arr.forEach((n, i, a) => n.fractionTotal = n.fraction + (i && a[i - 1].fractionTotal));
// или
arr.reduce((acc, n) => n.fractionTotal = acc + n.fraction, 0);
Object.values([
{key: 1, classifName: 'ABC', classifId: 1},
{key: 2, classifName: 'BCД', classifId: 2},
{key: 3, classifName: 'СДВ', classifId: 3},
{key: 1, classifName: 'ABC', classifId: 1},
{key: 1, classifName: 'ABC', classifId: 1},
].reduce((result, item) => {
result[item.classifId] = item;
return result;
}, {}))
type THash = {
id: number;
hash: string;
};
type TChannel = {
channelid: number;
childrenHash: THash[];
};
type TData = TChannel[];
type THashAcc = Record<THash["hash"], THash["id"][]>;
export const comparsion = (data: TData) =>
data.map((n) => {
const ids = Object.values(
n.childrenHash.reduce<THashAcc>((acc, m) => ((acc[m.hash] ??= []).push(m.id), acc), {})
).filter((m) => m.length > 1);
return {
...n,
childrenHash: ids.length ? ids : null,
};
});
id
как особый, и добавлять к нему в массив match
другие похожие — все id
с одинаковыми прочими значениями равноправны. Поэтому предлагаю как результат просто массивы, где собраны id
с совпадающими свойствами.id
, упорядоченных по алфавиту, и значений. Этот отпечаток будет одинаков у совпадающих объектов, несмотря на разные id
(и разный порядок ключей).{ id, hash }
, затем составляем «словарь», где ключи – хэши, а значения – Set'ы с id
, у которых оказался одинаковый хэш. Set'ы – чтобы не повторялись одинаковые id
.const arr = [
{ id: 1, we: 'cn', le: null },
{ id: 2, le: null, we: 'cn' },
{ id: 3, we: 'cn', le: 'car' },
{ id: 1, we: 'cn', le: null },
];
const dict = arr
.map(({ id, ...obj }) => {
const keys = Object.keys(obj).sort();
const ordered = keys.reduce((acc, c) => {
acc[c] = obj[c];
return acc;
}, {});
return { id, hash: JSON.stringify(ordered) };
})
.reduce((acc, c) => {
(acc[c.hash] ??= new Set()).add(c.id);
return acc;
}, {});
Object.values(dict).map(s => [...s]); // [ [1, 2], [3] ]
arr.map(n => {
const ids = Object
.values(n.childrenHash.reduce((acc, m) => ((acc[m.hash] ??= []).push(m.id), acc), {}))
.filter(m => m.length > 1);
return {
...n,
childrenHash: ids.length ? ids : null,
};
})
const arr = [
{channelid: 190,
childrenHash: [{id: 0, hash: 'sdfsdfsfsdf'}]},
{channelid: 191,
childrenHash: [{id: 0, hash: 'ABC'}, {id: 1, hash: 'ABC'}, {id: 2, hash: 'LLL'}, {id: 3, hash: 'LLL'}, {id: 4, hash: 'SSS'}]},
]
const res = arr.map(item=>{
item.childrenHash = Object.values(
item.childrenHash.reduce((obj,h)=>{
obj[h.hash] = obj[h.hash] || []
obj[h.hash].push(h.id)
return obj
},{})
).filter(l=>l.length>1)
if (!item.childrenHash.length) item.childrenHash = null
return item
})
console.log(JSON.stringify(res, null, 2))
<div class="box">
<div class="head">
<h2 class="title">Select documents to download</h2>
<span class="arrow">
<svg xmlns="http://www.w3.org/2000/svg" width="27.269" height="15.756" viewBox="0 0 27.269 15.756">
<path d="M925.974,98.658l-13.2-13.2a1.5,1.5,0,1,1,2.121-2.121l11.074,11.074,11.074-11.074a1.5,1.5,0,0,1,2.121,2.121Z" transform="translate(-912.339 -82.902)" fill="#dc5d37" />
</svg>
</span>
</div>
<div class="body">
<ul class="download-list">
<?php
// Check rows exists.
if (have_rows('download_docs')) :
$cnt = 0;
// Loop through rows.
while (have_rows('download_docs')) : the_row(); ?>
<?php
$cnt++;
$file = get_sub_field('doc');
$filedir = get_attached_file($file['id']);
$filename = get_the_title($file['id']);
if ($file) : ?>
<li class="item">
<?php
//$newStr = end(explode('/', $file['url']));
?>
<input value="<?php echo $filedir; ?>" type="checkbox" class="checkdownload" id="ch<?php echo $cnt; ?>">
<label for="ch<?php echo $cnt; ?>"><?php echo $filename; ?></label>
</li>
<!-- <a class="cheker" href="--><?php //echo $file['url'];
?>
<!--">--><?php //echo $file['filename'];
?>
<!--</a>-->
<?php endif; ?>
<?php
endwhile;
// No value.
else :
// Do something...
endif; ?>
</ul>
<div class="btn-wrap">
<button onclick="getCheckedCheckBoxes()" href="#download" class="btn btn-right popup-modal">Download</button>
</div>
</div>
</div>
function getCheckedCheckBoxes() {
var checkboxes = document.getElementsByClassName('checkdownload');
var checkboxesChecked = [];
for (var index = 0; index < checkboxes.length; index++) {
if (checkboxes[index].checked) {
checkboxesChecked.push(checkboxes[index].value); //
var sendUrls = (checkboxes[index].value); //
//console.log(sendUrls);
}
}
return checkboxesChecked;
}
const result = data
.flatMap(n => n.values)
.filter(n => n.Ids.some(m => arr.includes(m)))
.map(({ id, title }) => ({ id, title }));
const inArr = Set.prototype.has.bind(new Set(arr));
const data.reduce((acc, { values }) => (
values.forEach(({ Ids, ...n }) => Ids.some(inArr) && acc.push(n)),
acc
), []);
const result = allCass.filter(function(n) {
return !this.has(n.id);
}, new Set(defaultCass.map(n => n.id)));
function* diff(data1, data2, key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const keys = new Set;
for (const n of data2) {
keys.add(getKey(n));
}
for (const n of data1) {
if (!keys.has(getKey(n))) {
yield n;
}
}
}
const result = [...diff(allCass, defaultCass, 'id')];
Array.from(diff('abcdE', 'AcD', n => n.toLowerCase())) // ['b', 'E']
for (const n of diff(Array(8).keys(), Array(5).keys())) {
console.log(n); // 5 6 7
}
<Switch>
<Redirect
from={"/first"}
exact
to={"/first/item1"}
render={() => <Item {...props}/>}
/>
<Route
path={"/first/item1"}
render={() => <Item {...props}/>}
/>
<Route
path={ '/first/item2'}
render={() => <List {...props}/>}
/>
</Switch>
const Header = ({ children }) => (
<div className="navHeader">
{children}
</div>
);
<Header>
<Top />
</ Header>
const Header = ({ top }) => {
const HeaderTop = top || Top;
return (
<div className="navHeader">
<HeaderTop />
</div>
);
};
<Header /> // используем компонент по-умолчанию Top
<Header top={OtherTopCompnent} /> // используем другой компонент