Да, но только если ваша реализация включает функцию for
... of
, введенную в ECMAScript 2015 (релиз «Harmony»).
Это работает например:
// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
// ... do something with s ...
}
Или еще лучше, поскольку ECMAScript 2015 также предоставляет переменные с блочным диапазоном через let
и const
:
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
// ... do something with s ...
}
// s is no longer defined here
Многие разработчики JavaScript все еще работа в среде, которой еще нет, однако, особенно если писать код для работы в веб-браузерах, где разработчики сайта часто не могут быть уверены в том, какой браузер / версия будут использовать их клиенты.
Если вы может предположить, что интерпретатор JavaScript соответствует версии previous спецификации ECMAScript (которая исключает, например, версии Internet Explorer до 9), тогда вы можете использовать метод итератора forEach
вместо петля. В этом случае вы передаете функцию, которая будет вызываться для каждого элемента массива:
var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) {
// ... do something with s ...
} );
Но если даже это слишком много, чтобы предположить, и вы хотите что-то, что работает в , все версии JavaScript, тогда вам нужно использовать явный цикл подсчета. Самая безопасная версия, которая правильно обрабатывает разреженные массивы, выглядит примерно так:
var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i
Присвоение значения длины локальной переменной (в отличие от включения полного выражения myStringArray.length
в состоянии цикла) может существенно влияют на производительность, поскольку каждый раз пропускает поиск свойств; используя Rhino на моей машине, ускорение составляет 43%.
Вы часто увидите кеширование длины, выполненное в предложении инициализации цикла, например:
var i, len, myStringArray = [ "Hello", "World" ];
for (len = myStringArray.length, i=0; i
Синтаксис for
... in
, упомянутый другими, предназначен для перемещение по свойствам объекта; поскольку Array в JavaScript - это просто объект с именами числовых свойств (и автоматически обновляемое свойство length
), вы можете теоретически перебрать его через массив. Но проблема в том, что он не ограничивается численными значениями свойств (помните, что даже методы на самом деле являются просто свойствами, значение которых является замыканием), равно как и не перебирает их в числовом порядке. Поэтому синтаксис for
... in
должен использоваться для not для циклического прохождения через массивы.
Вот как это сделать с TypScript 2.0: (tsd и typings устарели в пользу следующего):
$ npm install --save lodash
# This is the new bit here:
$ npm install --save-dev @types/lodash
Затем в вашем файле .ts:
Либо:
import * as _ from "lodash";
Или (как предложено @Naitik):
import _ from "lodash";
Я не уверен, в чем разница. Мы используем и предпочитаем первый синтаксис. Однако некоторые сообщают, что первый синтаксис для них не работает, а кто-то еще прокомментировал, что последний синтаксис несовместим с ленивыми загруженными модулями webpack. YMMV.
Редактировать 27 февраля 2017 года:
В соответствии с @Koert ниже import * as _ from "lodash";
является единственным рабочим синтаксисом, указанным в машинописном тексте 2.2.1, lodash 4.17.4 и @ types / lodash 4.14.53. Он говорит, что другой предложенный синтаксис импорта дает ошибку «не имеет экспорта по умолчанию».
npm install --save lodash
npm install -D @types/lodash
//some_module_file.ts
// Load the full library...
import * as _ from 'lodash'
// work with whatever lodash functions we want
_.debounce(...) // this is typesafe (as expected)
import * as debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
UPDATE - March 2017
В настоящее время я работаю с ES6 modules
, и недавно я смог для работы с lodash
следующим образом:
// the-module.js (IT SHOULD WORK WITH TYPESCRIPT - .ts AS WELL)
// Load the full library...
import _ from 'lodash'
// work with whatever lodash functions we want
_.debounce(...) // this is typesafe (as expected)
...
import
конкретный lodash functionality
: import debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
...
ПРИМЕЧАНИЕ - разница в * as
не требуется в syntax
Удача.
Частичный импорт из lodash должен работать в угловом 4.1.x, используя следующие обозначения:
let assign = require('lodash/assign');
Или использовать «lodash-es» и импортировать в модуль:
import { assign } from 'lodash-es';
Возможно, это слишком странно, но ни одно из вышеизложенных не помогло мне, прежде всего, потому, что я правильно установил lodash (также был переустановлен с помощью вышеупомянутых предложений).
blockquote>
Я исправил его просто с помощью оператора JS
in
.
Обратите внимание, что npm install --save
будет способствовать любой зависимости, которую требует ваше приложение в производственном коде. Что касается «typings», это требуется только для TypeScript, который в конечном итоге переводится в JavaScript. Поэтому вы, вероятно, не хотите иметь их в производственном коде. Я предлагаю вместо этого использовать его в devDependencies
, используя
npm install --save-dev @types/lodash
или
npm install -D @types/lodash
(например, например, сообщение Акаша). Кстати, это так, как это делается в ng2 tuto.
В качестве альтернативы, вот как ваш package.json может выглядеть так:
{
"name": "my-project-name",
"version": "my-project-version",
"scripts": {whatever scripts you need: start, lite, ...},
// here comes the interesting part
"dependencies": {
"lodash": "^4.17.2"
}
"devDependencies": {
"@types/lodash": "^4.14.40"
}
}
просто подсказка
Хорошая вещь о npm
заключается в том, что вы можете начать с просто npm install --save
или --save-dev
, если вы не уверены в последней доступной версии зависимостей, которую вы ищете, и она автоматически установит это для вас в вашем package.json
для дальнейшего использования.
Если кто-то еще сталкивается с этой проблемой, и ни одно из вышеперечисленных решений не работает из-за проблем с повторяющимся идентификатором, запустите это:
npm install typings --global
. При использовании более старых версий типизации все испортится, и вы получить кучу проблем «Дублирующий идентификатор». Также вам не нужно использовать --ambient
больше, насколько я мог бы сказать.
Итак, как только типизация обновляется, это должно работать (с использованием быстрого запуска Angular 2).
Run:
npm install lodash --save
typings install lodash --save
Сначала добавьте это в systemjs.config.js:
'lodash': 'node_modules/lodash/lodash.js'
Теперь вы можете использовать его в любом файле: import * as _ from 'lodash';
Удалите папку с образцами и запустите npm install
, если у вас все еще есть проблемы.
У меня была точно такая же проблема, но в приложении Angular2, и эта статья просто решила его: https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1 # .p6gra5eli
Резюме статьи:
npm install lodash --save
tsd install underscore
<script src="node_modules/lodash/index.js"></script>
System.config({
paths: {
lodash: './node_modules/lodash/index.js'
import * as _ from ‘lodash’;
Надеюсь, это может быть полезно и для вашего случая
Обновление 26 сентября 2016 года:
Как следует из ответа Тейтай, вместо установок «типизации», которые мы использовали несколько месяцев назад, теперь мы можем использовать:
npm install --save @types/lodash
Вот некоторые дополнительные ссылки, поддерживающие этот ответ:
Если вы все еще используете установку типирования, см. комментарии ниже (другими) относительно '' '--ambient' '' и '' '--global' ''.
Также, в новом Quick Start, config больше не находится в index.html; теперь он находится в systemjs.config.ts (если используется SystemJS).
Исходный ответ:
Это сработало на моем mac (после установки Angular 2 в соответствии с Быстрый старт ):
sudo npm install typings --global
npm install lodash --save
typings install lodash --ambient --save
Вы можете найти различные файлы, например
Угловая 2 Quickstart использует System.js, поэтому я добавил «map» в config в index.html следующим образом:
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
map: {
lodash: 'node_modules/lodash/lodash.js'
}
});
Тогда в моем .ts-коде мне удалось:
import _ from 'lodash';
console.log('lodash version:', _.VERSION);
Редактирование с середины 2016 года:
Поскольку @tibbus упоминает, в некоторых контекстах , вам нужно:
import * as _ from 'lodash';
Если вы начинаете с angular2-seed , и если вы не хотите импортировать каждый раз, вы можете пропустить карту и импортировать шаги и просто uncomment lodash line в tools / config / project.config.ts.
Чтобы мои тесты работали с lodash, мне также пришлось добавить строку в массив файлов в файле karma.conf.js:
'node_modules/lodash/lodash.js',
, если dosen't работает после
$ npm install lodash --save
$ npm install --save-dev @types/lodash
, вы попробуете это и импортируете lodash
typings install lodash --save
Начиная с TypScript 2.0, для импорта типов используются модули @types npm.
# Implementation package (required to run)
$ npm install --save lodash
# Typescript Description
$ npm install --save @types/lodash
Теперь, когда этот вопрос был дан ответ, я расскажу, как эффективно импортировать lodash
Отказоустойчивый способ импорта всей библиотеки (в main.ts)
import 'lodash';
Реализация более легкого lodash с функциями, которые вам нужны
import chain from "lodash/chain";
import value from "lodash/value";
import map from "lodash/map";
import mixin from "lodash/mixin";
import _ from "lodash/wrapperLodash";
источник: https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba#.kg6azugbd
PS: В приведенной выше статье интересен вопрос о улучшении времени сборки и уменьшении размера приложения
Я использую ng2 с webpack, а не системой JS. Для меня были следующие шаги:
npm install underscore --save
typings install dt~underscore --global --save
, а затем в файле я хочу импортировать подчеркивание в:
import * as _ from 'underscore';
Я нахожусь на Angular 4.0.0, используя preboot / angular-webpack , и должен был пойти немного иначе.
Решение, предоставленное @Taytay, в основном работало для меня:
npm install --save lodash
npm install --save @types/lodash
и импортирования функций в заданный файл .component.ts, используя:
import * as _ from "lodash";
Это работает, потому что нет стандартного экспортированного класса. Разница в моей: мне нужно было найти способ загрузки в сторонних библиотеках: vendor.ts, который сидел на:
src/vendor.ts
Теперь файл vendor.ts выглядит следующим образом:
import '@angular/platform-browser';
import '@angular/platform-browser-dynamic';
import '@angular/core';
import '@angular/common';
import '@angular/http';
import '@angular/router';
import 'rxjs';
import 'lodash';
// Other vendors for example jQuery, Lodash or Bootstrap
// You can import js, ts, css, sass, ...
Вы также можете пойти и импортировать с помощью доброй старой необходимости, то есть:
const _get: any = require('lodash.get');
Это единственное, что сработало для нас. Конечно, убедитесь, что вызовы require () поступают после импорта.
Установить все через терминал:
npm install lodash --save
tsd install lodash --save
Добавить пути в index.html
<script>
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
paths: {
lodash: './node_modules/lodash/lodash.js'
}
});
System.import('app/init').then(null, console.error.bind(console));
</script>
Импортировать lodash в верхней части файла .ts
import * as _ from 'lodash'
Управление типами с помощью команд typings
и tsd
в конечном счете устарело в пользу использования npm через npm install @types/lodash
.
Однако я боролся с «Не могу найти модуль lodash» в инструкции import для долгое время:
import * as _ from 'lodash';
В конечном итоге я понял, что TypScript будет загружать только типы из node_modules / @ types start version 2, а моя служба VsCode Language по-прежнему использует 1.8, поэтому редактор сообщал об ошибках.
Если вы используете VSCode, вы захотите включить
"typescript.tsdk": "node_modules/typescript/lib"
в свой файл настроек VSCode.json (для параметров рабочей области) и убедитесь, что у вас есть машинописная версия> = 2.0.0, установленный через npm install typescript@2.0.2 --save-dev
. После этого мой редактор не будет жаловаться на инструкцию import.
Еще одно элегантное решение - получить только то, что вам нужно, а не импортировать все lodash
import {forEach,merge} from "lodash";
, а затем использовать его в коде
forEach({'a':2,'b':3}, (v,k) => {
console.log(k);
})
Установите через npm
.
$ npm install lodash --save
Теперь import
в файле:
$ import * as _ from 'lodash';
ENV:
Угловой CLI: 1.6.6 Узел: 6.11.2 ОС: darwin x64 Угловой: 5.2.2 машинописный: 2.4.2 webpack: 3.10.0
blockquote>
Я успешно импортировал lodash в свой проект со следующими командами:
npm install lodash --save
typings install lodash --save
Затем я импортировал его следующим образом:
import * as _ from 'lodash';
и в systemjs.config.js i определил это:
map: { 'lodash' : 'node_modules/lodash/lodash.js' }
Я также создал типы для lodash-es
, поэтому теперь вы можете сделать следующее
npm install lodash-es -S
npm install @types/lodash-es -D
import kebabCase from "lodash-es/kebabCase";
const wings = kebabCase("chickenWings");
если вы используете rollup, я предлагаю использовать это вместо lodash
, поскольку он будет treeshaken правильно.
sudo npm install typings --global
npm install lodash --save
typings install lodash --ambient --save
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
map: {
lodash: 'node_modules/lodash/index.js'
}
});
import _ from 'lodash';
Шаг 1: Измените файл package.json, чтобы включить lodash в зависимости.
"dependencies": {
"@angular/common": "2.0.0-rc.1",
"@angular/compiler": "2.0.0-rc.1",
"@angular/core": "2.0.0-rc.1",
"@angular/http": "2.0.0-rc.1",
"@angular/platform-browser": "2.0.0-rc.1",
"@angular/platform-browser-dynamic": "2.0.0-rc.1",
"@angular/router": "2.0.0-rc.1",
"@angular/router-deprecated": "2.0.0-rc.1",
"@angular/upgrade": "2.0.0-rc.1",
"systemjs": "0.19.27",
"es6-shim": "^0.35.0",
"reflect-metadata": "^0.1.3",
"rxjs": "5.0.0-beta.6",
"zone.js": "^0.6.12",
"lodash":"^4.12.0",
"angular2-in-memory-web-api": "0.0.7",
"bootstrap": "^3.3.6" }
Шаг 2: Я использую загрузчик модуля SystemJs в своем приложении angular2. Поэтому я бы модифицировал файл systemjs.config.js для отображения lodash.
(function(global) {
// map tells the System loader where to look for things
var map = {
'app': 'app', // 'dist',
'rxjs': 'node_modules/rxjs',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'@angular': 'node_modules/@angular',
'lodash': 'node_modules/lodash'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { defaultExtension: 'js' },
'lodash': {main:'index.js', defaultExtension:'js'}
};
var packageNames = [
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/router-deprecated',
'@angular/testing',
'@angular/upgrade',
];
// add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
packageNames.forEach(function(pkgName) {
packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
var config = {
map: map,
packages: packages
}
// filterSystemConfig - index.html's chance to modify config before we register it.
if (global.filterSystemConfig) { global.filterSystemConfig(config); }
System.config(config);})(this);
Шаг 3: Теперь сделайте npm install
. Шаг 4: Чтобы использовать lodash в вашем файле.
import * as _ from 'lodash';
let firstIndexOfElement=_.findIndex(array,criteria);