Да.
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
data["PropertyD"] = 4;
// dialog box with 4 in it
alert(data.PropertyD);
alert(data["PropertyD"]);
Это должно сделать это для вас.
const a = [1,2,3,4,7,8,12,15,21,21,22,23,27]
let min = a[0], last = a[0]
const result = a.reduce((arr, n, i) => {
if(n - last > 1){
if(min == last) arr.push(""+min)
else arr.push([min, last].join("-"))
min = n
}
if(i == a.length - 1) {
if(min == n) arr.push(""+min)
else arr.push([min, n].join("-"))
}
last = n
return arr
}, [])
console.log(result)
Другим способом может быть
let a = [1,2,3,4,7,8,12,15,21,21,22,23]
let r = a.reduce((acc, val) => {
const lastGroup = acc.pop() || [];
const lastValue = lastGroup.slice(-1)[0];
if (val - lastValue > 1) {
return [...acc, lastGroup, [val]];
}
return [...acc, [...lastGroup, val]];
}, []).map(group => {
const first = group[0];
const last = group[group.length-1];
return first !== last ? `${first}-${last}` : `${first}`;
});
console.log(r)
Вот также мой ответ (вдохновленный ответами других)
let r = (a,c='-',f=a[0],g=[]) => (a.map((x,i,a,b=a[i+1]) =>
b<=x+1 ? 0 : (g.push( f-x ? f+c+x : f+'' ),f=b) ),g);
let a = [1,2,3,4,7,8,12,15,21,21,22,23];
let b = [-7,-5,-4,-3,-1,0,1,3,4,5,8];
let r = (a,c='-',f=a[0],g=[]) => (a.map((x,i,a,b=a[i+1]) =>
b<=x+1 ? 0 : (g.push( f-x ? f+c+x : f+'' ),f=b) ),g);
let J= JSON.stringify;
console.log(J(a) + ' -> ' + J(r(a)));
console.log(J(b) + ' -> ' + J(r(b,'..')));
Объяснение: g = [] содержит результат, первый элемент диапазона равен f=a[0]
, в начале мы проверяем, равен ли следующий элемент b=a[i+1]
текущему элементу x или меньше b<=x+1
или меньше его. Если NO (что означает, что диапазон заканчивается или i
является последним индексом - b = undefined), тогда мы увеличиваем диапазон до результата g.push( f-x ? f+'-'+x : f+'' )
(мы проверяем, что x не равен f на f-x -> f-x!=0 -> f!=x
), после того, как push установил первый диапазон элемент f
до следующего диапазона (элемент b
).
Вам не нужны две петли, просто следите, где вы начали группу:
let array = [1,2,3,4,7,8,12,15,21,21,22,23]
const groups = [];
let start = array[0];
array.push(NaN);
for(let index = 1; index < array.length; index++) {
const value = array[index], previous = array[index - 1];
if(value === previous + 1 || value === previous)
continue;
if(start === previous) {
groups.push("" + previous);
} else {
groups.push(start + "-" + previous);
}
start = value;
}
console.log(groups);
Вы можете сохранить следующее ожидаемое значение в замыкании и уменьшить массив.
function getRanges(array) {
return array.reduce((l => (r, v, i, a) => {
if (l[1] > v) return r;
r.push(l[1] === v
? (r.pop(), l.join('-'))
: (l = [v, v]).slice(0, 1).toString()
);
l[1]++;
return r;
})([]), []);
}
console.log(getRanges([-3, -2, -1, 2]));
console.log(getRanges([1, 2, 3, 4, 7, 8, 12, 15, 21, 21, 22, 23]));