SUM()
является агрегированной функцией. Он принимает все строки, которые возвращаются для группы, и добавляет их.
Поскольку у вас нет предложения GROUP BY
, он суммирует значения всех строк, даже если их нет. Затем он возвращает общее число в виде одной строки, поэтому должна быть только 1 строка.
Если вы уточните, что хотите вернуть, я могу попытаться помочь вам написать заявление, чтобы вернуть его.
Я также не знаю значение индекса этого объекта
blockquote>, для которого вы можете использовать findIndex . Сначала получите индекс требуемого объекта, а в другой переменной получите последний объект в массиве. Затем поменяйте их местами
var arrayData = [{ label: "data", value: "data" }, { label: "data", value: "data" }, { label: "Others", value: "Others" }, { label: "data", value: "data" }, ] let findIndex = arrayData.findIndex(function(item) { return item.label === 'Others' && item.value === 'Others' }) let storeLastVal = arrayData[arrayData.length - 1]; let otherVal = arrayData[findIndex] arrayData[findIndex] = storeLastVal; arrayData[arrayData.length - 1] = otherVal; console.log(arrayData)
Хорошо, вы можете сначала проанализировать массив и создать два массива, один с элементами, которые останутся на месте, другой с элементами, которые будут размещены в конце. Затем вы можете присоединиться к этим двум массивам.
arrayData = [
{label:"data",value:"data"},
{label:"data",value:"data"},
{label:"Others",value:"Others"},
{label:"data",value:"data"},
]
var startValues = [];
var endValues = [];
arrayData.forEach((value) => {
if (value.label === "Others") {
endValues.push(value);
} else {
startValues.push(value);
}
});
arrayData = startValues.concat(endValues);
Вы можете сначала отфильтровать его, а затем вставить в конец:
var arrayData = [
{label:"data",value:"data"},
{label:"data",value:"data"},
{label:"Others",value:"Others"},
{label:"data",value:"data"},
]
var res = arrayData.filter(x => x.label !== 'Others');
res.push(arrayData.find(x => x.label === 'Others'));
console.log(res);
Вы могли бы сначала получить индекс, соединить этот элемент и выдвинуть расширенный массив.
var array = [{ label: "data", value: "data" }, { label: "data", value: "data" }, { label: "Others", value: "Others" }, { label: "data", value: "data" }],
index = array.findIndex(({ value }) => value === 'Others');
array.push(...array.splice(index, 1));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Или вы можете использовать рекурсию. Эта программа имеет явное преимущество в том, что ей не нужно находить элемент (или индекс) перед началом вычисления -
const data =
[ { label: "data", value: "data" }
, { label: "data", value: "data" }
, { label: "Others", value: "Others" }
, { label: "data", value: "data" }
]
const transform = ([ a, ...rest ]) =>
a === undefined
? []
: a.label === "Others"
? [ ...transform (rest), a ]
: [ a, ...transform (rest) ]
console .log (transform(data))
// [ { label: "data", value: "data" }
// , { label: "data", value: "data" }
// , { label: "data", value: "data" }
// , { label: "Others", value: "Others" }
// ]
Очевидно, что вы, вероятно, должны сделать "Others"
параметром функции -
const data =
[ { label: "data", value: "data" }
, { label: "data", value: "data" }
, { label: "Others", value: "Others" }
, { label: "data", value: "data" }
]
const transform = (query, [ a, ...rest ]) =>
a === undefined
? []
: a.label === query
? [ ...transform (query, rest), a ]
: [ a, ...transform (query, rest) ]
console .log (transform ("Others", data))
// [ { label: "data", value: "data" }
// , { label: "data", value: "data" }
// , { label: "data", value: "data" }
// , { label: "Others", value: "Others" }
// ]
console .log (transform ("data", data))
// [ { label: "Others", value: "Others" }
// , { label: "data", value: "data" }
// , { label: "data", value: "data" }
// , { label: "data", value: "data" }
// ]
Обратите внимание, что исходный ввод не мутировал. Если найдено несколько меток, соответствующих запросу, все из них будут перемещены в конец массива.