#javascript
#javascript
Вопрос:
У меня есть следующие данные массива, и я вычисляю количество записей, которые соответствуют, используя критерии включения.
var final =
[
[
"61131",
"NISSAN",
"BOLTON",
"MAINT"
],
[
"61132",
"NISSAN",
"BOLTON",
"MAINT"
],
[
"61133",
"TOYOTA",
"STOCKPORT",
"STORED"
],
[
"61134",
"TOYOTA",
"STOCKPORT",
"MAINT"
],
[
"61135",
"NISSAN",
"STOCKPORT",
"MAINT"
],
[
"61136",
"NISSAN",
null,
null
]
]
и код такой :
var obj = {};
var num1 = 0;
var num2 = 0;
for (var i=0; i<final.length; i ){
if(final[i].join(';').includes('BOLTON') amp;amp; final[i].join(';').includes('MAINT') amp;amp; final[i].join(';').includes('NISSAN')) {
num1 ;
}
}
for (var i=0; i<final.length; i ){
if(final[i].join(';').includes('STOCKPORT') amp;amp; final[i].join(';').includes('STORED') amp;amp; final[i].join(';').includes('TOYOTA')) {
num2 ;
}
}
obj['BOLTON_MAINT_NISSAN'] = num1
obj['STOCKPORT_STORED_TOYOTA'] = num2
console.log(obj)
вывод
{ "BOLTON_MAINT_NISSAN": 2, "STOCKPORT_STORED_TOYOTA": 1}
Я получаю желаемый результат, есть ли более эффективный способ написания приведенного выше кода, который является минимальным?
Комментарии:
1. определенно не самый эффективный. учтите, что
final[i].join(';')
это всегда возвращает одно и то же, но выполняется шесть (6) раз для каждого элемента в вашем массиве.2. Рассмотрите возможность использования reduce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
3. Ну, код очень неэффективен в том, что вы присоединяетесь к каждой проверке.
4. похоже, что массивы содержат позиционные данные. т.Е. Номер детали всегда отображается в первой позиции, а производитель
Nissan
илиToyota
всегда отображается во второй позиции и т.д. Вам, вероятно, вообще не нужно использовать.join
Ответ №1:
const count = (list, keys) => {
return keys.reduce(
(obj, key) => ({
...obj,
[key]: list.filter(sublist =>
key.split('_').every(keyPart => sublist.includes(keyPart))
).length
}),
{}
);
};
count(final, ['BOLTON_MAINT_NISSAN', 'STOCKPORT_STORED_TOYOTA'])
const final = [
[ "61131", "NISSAN", "BOLTON", "MAINT" ],
[ "61132", "NISSAN", "BOLTON", "MAINT" ],
[ "61133", "TOYOTA", "STOCKPORT", "STORED" ],
[ "61134", "TOYOTA", "STOCKPORT", "MAINT" ],
[ "61135", "NISSAN", "STOCKPORT", "MAINT" ],
[ "61136", "NISSAN", null, null ]
];
const count = (list, keys) => {
return keys.reduce(
(obj, key) => ({
...obj,
[key]: list.filter(sublist =>
key.split('_').every(keyPart => sublist.includes(keyPart))
).length
}),
{}
);
};
var bmtNsst = count(final, ['BOLTON_MAINT_NISSAN', 'STOCKPORT_STORED_TOYOTA']);
console.log(bmtNsst);
Ответ №2:
Используя reduce, slice, чтобы избавиться от числа, filter, чтобы избавиться от нулей, и join, чтобы сделать его ключом.
var final = [
["61131", "NISSAN", "BOLTON", "MAINT"],
["61132", "NISSAN", "BOLTON", "MAINT"],
["61133", "TOYOTA", "STOCKPORT", "STORED"],
["61134", "TOYOTA", "STOCKPORT", "MAINT"],
["61135", "NISSAN", "STOCKPORT", "MAINT"],
["61136", "NISSAN", null, null]
];
var grouped = final.reduce(function(obj, data) {
var key = data.slice(1).filter(Boolean).join("_");
obj[key] = (obj[key] || 0) 1;
return obj;
}, {});
console.log(grouped)
Ответ №3:
Нет необходимости использовать String.join
. Массив также имеет функцию Array.prototype.includes
для проверки, существует ли элемент в массиве или нет.
Используя это, вы можете найти подмассив, который удовлетворяет вашему условию. И используя Array.prototype.filter
, вы можете извлечь подмассивы, чтобы удовлетворить следующим условиям.
const final = [
[ "61131", "NISSAN", "BOLTON", "MAINT" ],
[ "61132", "NISSAN", "BOLTON", "MAINT" ],
[ "61133", "TOYOTA", "STOCKPORT", "STORED" ],
[ "61134", "TOYOTA", "STOCKPORT", "MAINT" ],
[ "61135", "NISSAN", "STOCKPORT", "MAINT" ],
[ "61136", "NISSAN", null, null ]
];
const num1Arr = final.filter((item) => item.includes('BOLTON') amp;amp; item.includes('MAINT') amp;amp; item.includes('NISSAN'));
const num2Arr = final.filter((item) => item.includes('STOCKPORT') amp;amp; item.includes('STORED') amp;amp; item.includes('TOYOTA'));
const output = {
BOLTON_MAINT_NISSAN: num1Arr.length,
STOCKPORT_STORED_TOYOTA: num2Arr.length
};
console.log(output);
Или просто, вы можете сделать это с помощью Array.prototype.reduce
.
const final = [
[ "61131", "NISSAN", "BOLTON", "MAINT" ],
[ "61132", "NISSAN", "BOLTON", "MAINT" ],
[ "61133", "TOYOTA", "STOCKPORT", "STORED" ],
[ "61134", "TOYOTA", "STOCKPORT", "MAINT" ],
[ "61135", "NISSAN", "STOCKPORT", "MAINT" ],
[ "61136", "NISSAN", null, null ]
];
const output = final.reduce((acc, cur) => {
if (cur.includes('BOLTON') amp;amp; cur.includes('MAINT') amp;amp; cur.includes('NISSAN')) {
acc['BOLTON_MAINT_NISSAN'] ;
}
if (cur.includes('STOCKPORT') amp;amp; cur.includes('STORED') amp;amp; cur.includes('TOYOTA')) {
acc['STOCKPORT_STORED_TOYOTA'] ;
}
return acc;
}, {
BOLTON_MAINT_NISSAN: 0,
STOCKPORT_STORED_TOYOTA: 0
});
console.log(output);
Ответ №4:
const final =
[
[
"61131",
"NISSAN",
"BOLTON",
"MAINT"
],
[
"61132",
"NISSAN",
"BOLTON",
"MAINT"
],
[
"61133",
"TOYOTA",
"STOCKPORT",
"STORED"
],
[
"61134",
"TOYOTA",
"STOCKPORT",
"MAINT"
],
[
"61135",
"NISSAN",
"STOCKPORT",
"MAINT"
],
[
"61136",
"NISSAN",
null,
null
]
];
console.log({
BOLTON_MAINT_NISSAN: final.filter((value) => {
return value[1] === 'NISSAN' amp;amp; value[2] === 'BOLTON' amp;amp; value[3] === 'MAINT';
}).length,
STOCKPORT_STORED_TOYOTA: final.filter((value) => {
return value[1] === 'TOYOTA' amp;amp; value[2] === 'STOCKPORT' amp;amp; value[3] === 'STORED';
}).length,
});
Ответ №5:
Использование Array.prototype.reduce():
const final = [
[ "61131", "NISSAN", "BOLTON", "MAINT" ],
[ "61132", "NISSAN", "BOLTON", "MAINT" ],
[ "61133", "TOYOTA", "STOCKPORT", "STORED" ],
[ "61134", "TOYOTA", "STOCKPORT", "MAINT" ],
[ "61135", "NISSAN", "STOCKPORT", "MAINT" ],
[ "61136", "NISSAN", null, null ]
];
let occurrence = final.reduce((obj, item)=>{
var key=item[2] "_" item[3] "_" item[1];
if(!obj[key]) obj[key]=0;
obj[key] ;
return obj;
},{});
console.log(occurrence);
Ответ №6:
В вашем решении вы дважды выполняете итерацию по массиву, что не является необходимым, поскольку, если объект является одним из двух, которые вы ищете, тогда это не другой, поэтому вы можете выполнить все в одном цикле.
var final = [
["61131", "NISSAN", "BOLTON", "MAINT"],
["61132", "NISSAN", "BOLTON", "MAINT"],
["61133", "TOYOTA", "STOCKPORT", "STORED"],
["61134", "TOYOTA", "STOCKPORT", "MAINT"],
["61135", "NISSAN", "STOCKPORT", "MAINT"],
["61136", "NISSAN", null, null]
];
var obj = {
BOLTON_MAINT_NISSAN: 0,
STOCKPORT_STORED_TOYOTA: 0
};
final.forEach(y => {
let x = y.join(';');
if(x.includes('BOLTON') amp;amp;
x.includes('MAINT') amp;amp;
x.includes('NISSAN'))
obj.BOLTON_MAINT_NISSAN ;
else if (
x.includes('STOCKPORT') amp;amp;
x.includes('STORED') amp;amp;
x.includes('TOYOTA')
)
obj.STOCKPORT_STORED_TOYOTA ;
})
console.log(obj)