Backbone.js - объект не поддерживает свойство или метод each

У меня очень мало опыта работы с Backbone, но я унаследовал код другого разработчика для поддержки. Я пытаюсь добавить в модель какой-то новый функционал. Вот что у меня есть на данный момент:

    var AfeDetailCollection = Backbone.Collection.extend(
    {
        model: AfeDetailModel,
        getSubtotalUSD: function(){
            return _.reduce(this.models, function(memo, model, index, list){
                return memo + model.getExtCostUSD();
            }, 0, this);
        },
        getSubtotalLocal: function () {
            return _.reduce(this.models, function (memo, model, index, list) {
                return memo + model.getExtCostLocal();
            }, 0, this);
        },
        hasMixedCurrency: function () {
            var currCode = '';
            this.models.each(function (model) {
                if (currCode == '')
                    // Identify the currencyCode of the first AfeDetail object in the collection
                    currCode = model.get('currencyCode');
                else if (currCode != model.get('currencyCode'))
                    // The currencyCode has changed from prior AfeDetail in the collection
                    return true;
            });
            return false;
        }
    }
);

Я добавил функцию hasMixedCurrency (). Две ранее существовавшие функции работают нормально. Я пытаюсь определить, содержит ли коллекция объектов AfeDetail несколько значений currencyCode (свойство модели AfeDetail). Итак, я просто пытался перебирать эту коллекцию, пока не нашел изменение в currencyCode, а затем вернул true.

Однако в javascript на моей странице, как только я попытаюсь это проверить ...

if (this.collection.hasMixedCurrency()) {
   ...

... Я получаю это: Ошибка: объект не поддерживает свойство или метод "каждый"

Я явно что-то делаю не так, наверное, что-то простое, но я этого просто не вижу.

Нет такого метода под названием each для массива JS afaik ... попробуйте this.each, this является ссылкой на коллекцию.

T J 10.01.2019 11:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что this.models - это массив javascript, а не сборник позвоночника.

Вы можете попробовать каждый метод подчеркивать:

_.each(arr, function(val) { 

});

Также ваша логика в цикле выглядит неправильно. Попробуйте этот код:

hasMixedCurrency: function() {
    return _.size(_.uniq(this.models, "currencyCode")) > 1;
}

jsFiddle


Edit: More performanced way

hasMixedCurrency: function () {
    return _.find(this.models, function(v) { return v.currencyCode !== _.first(this.models).currencyCode; }) !== undefined;
}

Это массив JavaScript, в котором нет метода each. Кстати, если бы это была коллекция, each работал бы, потому что у него есть метод each.

T J 10.01.2019 11:26

Да, ты прав. Я ошибся при написании. Прошу прощения.

ibrahimyilmaz 10.01.2019 11:50

Думаю, мне нужно вникнуть в это подробнее, чтобы понять разницу между массивом JS и коллекцией Backbone. В любом случае, ваш образец кода сделал свое дело! @ibrahimyilmaz

PongGod 11.01.2019 18:28

На самом деле, при ближайшем рассмотрении этот код работает не так, как надо. Он каждый раз возвращает True. Он должен возвращать значение true только тогда, когда массив содержит более одного значения currencyCode. Я продолжу играть с этим.

PongGod 11.01.2019 18:49

Да, @PongGod, ты тоже прав :) Проверьте мой отредактированный ответ и попробуйте скрипт выше.

ibrahimyilmaz 14.01.2019 11:04

Когда я запускаю вашу скрипку, я ничего не вижу. Кстати, я начал использовать другой подход, который, как я думал, сработает, но его еще нет. Возможно, вы можете взглянуть и сообщить мне, что вы думаете: jsfiddle.net/PongGod/6qvz2p94/3

PongGod 14.01.2019 19:27

На самом деле, простая корректировка кода делает все правильно: return .размер(.uniq (this.models, "currencyCode"))> 1; Нет необходимости сравнивать размер массива. Проще говоря, если в массиве появляется более одного значения currencyCode, оно должно возвращать true. Если вы можете соответствующим образом отредактировать приведенный выше код, я приму это как правильный ответ.

PongGod 14.01.2019 19:34

Ты неправ. Функция _.uniq возвращает тот же массив без повторяющихся значений. Итак, размер _.uniq () для array1 и array2 равен 3. Снова посмотрим на скрипку, сейчас я пишу в html.

ibrahimyilmaz 14.01.2019 20:02

Также ваша рабочий пример недействительна. Нельзя сравнивать только первое и последнее значения массива. Двойные значения могут быть посередине.

ibrahimyilmaz 14.01.2019 20:09

Что касается моей скрипки, возможно, вы не заметили, что я отсортировал значения перед сравнением. Пример работает, но, к сожалению, у меня возникли трудности с его успешной адаптацией к моему приложению. Однако, когда я изменил ваш код, как я описал, он начал работать правильно. Что касается вашей обновленной скрипки, я не вижу вывода в разделе консоли. В любом случае все три массива содержат смешанные валюты, поэтому я не уверен, как это доказывает, что это работает. Конечно, я могу отредактировать один из них, чтобы включить только одну валюту, но я все еще не могу увидеть результат, когда я его запускаю.

PongGod 14.01.2019 22:26

Я добавил скриншот экрана jsFiddle. В любом случае, ваша рабочий пример все еще не права, попробуйте подумать об этом.

ibrahimyilmaz 15.01.2019 13:32

Логика в моей скрипке не ошибочна. Если у вас есть массив строк и вы отсортируете их в алфавитном порядке, сравните первое и последнее значения и обнаружите, что они совпадают, то вы с уверенностью знаете, что между ними нет различающихся значений. В любом случае, я уже отказался от этого подхода в пользу вашего с небольшой модификацией, которую я описал, и она работает. Я очень признателен за вашу помощь и с радостью отмечу его как решение, если вы обновите его соответствующим образом. В нынешнем виде этот код не работает для меня как решение.

PongGod 15.01.2019 15:45

Кстати, твоя рабочий пример - это не та рабочий пример. Все три из этих примеров массивов должны возвращать True, потому что все они имеют смешанные валюты. Если, например, одно из значений включало только «USD», то оно должно вернуть False. Возможно, вы неправильно поняли мои требования, но я думаю, что объяснил это довольно ясно.

PongGod 15.01.2019 15:51

Прошу прощения за недоразумение, я думал, вы хотите найти повторяющиеся значения. Ты прав.

ibrahimyilmaz 15.01.2019 20:02

Если вы измените свой ответ выше на: .size (.uniq (this.models, "currencyCode"))> 1; Я могу принять это как решение. Спасибо!

PongGod 15.01.2019 21:08

Я отредактировал его и добавил более добрый (высокопроизводительный) метод. Нам не нужно делать массив уникальным.

ibrahimyilmaz 15.01.2019 21:11

Позвольте нам продолжить обсуждение в чате.

PongGod 16.01.2019 03:57

Другие вопросы по теме