Обычно это хранимые процедуры: для реализации нескольких операторов SQL в последовательности. Используя откаты, вы можете убедиться, что они рассматриваются как одна единица работы, то есть либо все они выполнены, либо ни одна из них не поддерживает согласование данных.
Используя Object.entries
, вы делаете что-то вроде этого.
// array like object with random key ordering
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(anObj)); // [ ['2', 'b'],['7', 'c'],['100', 'a'] ]
Метод Object.entries () возвращает массив собственного перечислимого свойства данного объекта [key, value]
Таким образом, вы можете перебирать объект и иметь key
и value
для каждого объекта и получать что-то вроде этого.
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
Object.entries(anObj).map(obj => {
const key = obj[0];
const value = obj[1];
// do whatever you want with those values.
});
или как этот
// Or, using array extras
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});
Для справки смотрите документы MDN для Записи объектов
Наконец я придумал удобную функцию полезности с унифицированным интерфейсом для итерации объектов, строк, массивов, типизированных массивов, карт, наборов (любые итерации).
const iterate = require('@a-z/iterate-it');
const obj = { a: 1, b: 2, c: 3 };
iterate(obj, (value, key) => console.log(key, value));
// a 1
// b 2
// c 3
-> если мы перебираем объект JavaScript, используя и находим ключ из массива объектов
Object.keys(Array).forEach(key => {
console.log('key',key)
})
Единственный надежный способ сделать это - сохранить ваши данные объекта в 2 массивах, один из ключей и один для данных:
var keys = [];
var data = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
keys.push(key);
data.push(obj[key]); // Not necessary, but cleaner, in my opinion. See the example below.
}
}
Затем вы можете перебирать массивы, как вы обычно:
for(var i = 0; i < 100; i++){
console.log(keys[i], data[i]);
//or
console.log(keys[i], obj[keys[i]]); // harder to read, I think.
}
for(var i = 100; i < 300; i++){
console.log(keys[i], data[i]);
}
Я не использую Object.keys(obj)
, потому что это IE 9 +.
Если вы хотите итерировать весь объект сразу, вы можете использовать цикл for in
:
for (var i in obj) {
...
}
. Но если вы хотите разделить объект на части, на самом деле вы не можете. Нет никакой гарантии, что свойства объекта находятся в каком-либо заданном порядке. Поэтому я могу думать о двух решениях.
Первым из них является «удалить» уже прочитанные свойства:
var i = 0;
for (var key in obj) {
console.log(obj[key]);
delete obj[key];
if ( ++i > 300) break;
}
Другим решением, которое я могу представить, является использование массива массивов вместо объекта:
var obj = [['key1', 'value1'], ['key2', 'value2']];
Затем будет работать стандартный цикл for
.
var Dictionary = {
If: {
you: {
can: '',
make: ''
},
sense: ''
},
of: {
the: {
sentence: {
it: '',
worked: ''
}
}
}
};
function Iterate(obj) {
for (prop in obj) {
if (obj.hasOwnProperty(prop) && isNaN(prop)) {
console.log(prop + ': ' + obj[prop]);
Iterate(obj[prop]);
}
}
}
Iterate(Dictionary);
Object
s находятся в порядке. Они не. If you can make sense of the sentence it worked
работает только из-за деталей реализации. Это не гарантированно работает вообще. Также вы не должны использовать TitleCase ваши функции & amp; переменные. Это для class
.
– Dodekeract
19 February 2017 в 13:46
Вы можете попробовать использовать lodash - современную библиотеку утилиты JavaScript, обеспечивающую модульность, производительность и amp; extras js для быстрого итерации объекта: -
var users = {
'fred': {
'user': 'fred',
'age': 40
},
'pebbles': {
'user': 'pebbles',
'age': 1
}
};
_.mapValues(users, function(o) {
return o.age;
});
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
// The `_.property` iteratee shorthand.
console.log(_.mapValues(users, 'age')); // returns age property & value
console.log(_.mapValues(users, 'user')); // returns user property & value
console.log(_.mapValues(users)); // returns all objects
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>
С новыми функциями ES6 / ES2015 вам больше не нужно использовать объект, чтобы перебирать хэш. Вы можете использовать Map . Карты Javascript сохраняют ключи в порядке вставки, то есть вы можете перебирать их без необходимости проверять hasOwnProperty, который всегда был действительно взломан.
Итерации по карте:
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
for (var key of myMap.keys()) {
console.log(key);
}
// Will show 2 logs; first with "0" and second with "1"
for (var value of myMap.values()) {
console.log(value);
}
// Will show 2 logs; first with "zero" and second with "one"
for (var [key, value] of myMap.entries()) {
console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
или используйте для каждого:
myMap.forEach(function(value, key) {
console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
Действительно, PITA это не является частью стандартного Javascript.
/**
* Iterates the keys and values of an object. Object.keys is used to extract the keys.
* @param object The object to iterate
* @param fn (value,key)=>{}
*/
function objectForEach(object, fn) {
Object.keys(object).forEach(key => {
fn(object[key],key, object)
})
}
Примечание. Я переключил параметры обратного вызова на (значение, ключ) и добавил третий объект, чтобы сделать API совместимым с другими API.
Используйте его так
const o = {a:1, b:true};
objectForEach(o, (value, key, obj)=>{
// do something
});
this
на все, что вам нравится для обратного вызова, поскольку обратный вызов имеет свой собственный контекст.
– CONTRACT SAYS I'M RIGHT
12 June 2018 в 15:53
objectForEach
. Извините, если это сбивает с толку.
– CONTRACT SAYS I'M RIGHT
12 June 2018 в 21:25
Вот еще одно итерационное решение для современных браузеров:
Object.keys(obj).filter(function(k, i) {
return i >= 100 && i < 300;
}).forEach(function(k) {
console.log(obj[k]);
});
Или еще короче:
Object.keys(obj).forEach(function(k, i) {
if (i >= 100 && i < 300) {
console.log(obj[k]);
}
});
Однако вы должны учитывать, что свойства объекта JavaScript не сортируются, т. е. не имеют порядка.
keys
из приведенного кода должно быть достаточно.
– Yoshi
17 January 2013 в 14:47