есть ли способ изменить данные этого массива с помощью данных объекта в этом коде

#javascript

#javascript

Вопрос:

у меня есть этот Crosswordpuzzle, созданный javascript, и я хочу изменить данные этого массива с помощью object data, я попробовал это, но код выдает много ошибок, мне нужно поместить эти новые данные, потому что первые данные не содержат вопросов crossWordPuzzle. этот код :

crossWordPuzzle.js

         const attemptsToFitWords = 5000;
        const gridsToMake = 20;
        const gridSize = 20;

        let usedWords = [];
        let generatedGrids = [];
        let goodStartingLetters = new Set()

        let slots = gridSize * gridSize;
        let gridDiv = document.getElementById("grid");
        let row = 0;
        let column = 0;
        for( let slot = 0; slot < slots; slot   )
        {
            let div = document.createElement("input");
            div.id = row   "_"   column; 
            div.classList.add("slot");
            div.style.border =  '1px solid #e9e9e9';
            div.style.backgroundColor = '#e9e9e9';
            gridDiv.appendChild(div);
            column  ;
            if( column >= gridSize )
            {
                column = 0;
                row  ;
            }
        }

        let createCrossWordPuzzle = function()
        {
            let attemptToPlaceWordOnGrid = function(grid, word)
            {
                let text = getAWordToTry();
                for (let row = 0; row < gridSize;   row)
                {
                    for (let column = 0; column < gridSize;   column)
                    {
                        word.text = text;
                        word.row = row;
                        word.column = column;
                        word.vertical = Math.random() >= 0.5;

                        if ( grid.isLetter( row, column ) )
                        {
                            if ( grid.update( word ) )
                            {
                                pushUsedWords( word.text );
                                return true;
                            }
                        }
                    }
                }
                return false;

            }

            let getAWordToTry = function()
            {
                let word = getRandomWord( words );
                let goodWord = isGoodWord( word );

                while ( usedWords.includes( word ) || !goodWord )
                {
                    word = getRandomWord( words );
                    goodWord = isGoodWord( word );
                }
                return word;
            }

            let getBestGrid = function( grids )
            {
                let bestGrid = grids[ 0 ];
                for(let grid of grids) 
                {
                    if ( grid.getIntersections() >= bestGrid.getIntersections() )
                    {
                        bestGrid = grid;
                    }
                }
                return bestGrid;
            }

            let isGoodWord = function( word )
            {
                let goodWord = false;
                for(let letter of goodStartingLetters) 
                {
                    if( letter === word.charAt(0))
                    {
                        goodWord = true;
                        break;
                    }
                }
                return goodWord;
            }

            let generateGrids = function()
            {
                generatedGrids = [];

                for ( let gridsMade = 0; gridsMade < gridsToMake; gridsMade   ) 
                {
                    let grid = new CrosswordPuzzle();
                    let word = new Word( getRandomWordOfSize( getUnusedWords(), 9 ),
                                                0, 0, false );
                    grid.update(word);
                    pushUsedWords(word.text);

                    let continuousFails = 0;
                    for (let attempts = 0; attempts < attemptsToFitWords;   attempts)
                    {
                        let placed = attemptToPlaceWordOnGrid( grid, word );
                        if( placed )
                        {
                            continuousFails = 0;
                        }
                        else
                        {
                            continuousFails  ;
                        }
                        if( continuousFails > 470 )
                        {
                            break;
                        }
                    }

                    generatedGrids.push( grid );
                    if( grid.getIntersections() >= 4 )
                    {
                        break;
                    }
                    usedWords = [];
                }
            }
            
            let displayCrosswordPuzzle = function( bestGrid )
            {      
                for (let row = 0; row < gridSize;   row)
                {
                    for (let column = 0; column < gridSize;   column)
                    {
                        let slot = document.getElementById(row   "_"   column);
                        if( bestGrid.isLetter(row, column))
                        {
                            slot.value = bestGrid.grid[row][column];
                            slot.style.borderBottom =  '1px solid #9a8e9a';
                            slot.style.borderRight =  '1px solid #9a8e9a';
                            slot.style.backgroundColor = 'rgb(102, 178, 255)'; 
                        }
                        else
                        {
                            slot.value = "";
                            slot.style.border =  '1px solid #e9e9e9';
                            slot.style.backgroundColor = '#e9e9e9';
                        }
                    }
                }
            }

            let pushUsedWords = function( text )
            {
                usedWords.push( text );
                text.split('').filter( char => goodStartingLetters.add(char));
            }

            generateGrids();
            let bestGrid = getBestGrid( generatedGrids );
            displayCrosswordPuzzle( bestGrid );
        }

        function getUnusedWords()
        {
            return words.filter(val => !usedWords.includes(val));
        }

        function getRandomWordOfSize( wordList, wordSize )
        {
            let properLengthWords = wordList.filter(val => val.length >= wordSize );
            return properLengthWords[getRandomInt(properLengthWords.length)]
        }

        function getRandomWord( wordList )
        {
            let words = getUnusedWords();
            return words[getRandomInt(words.length)]
        }

        function getRandomInt( max )
        {
            return Math.floor(Math.random() * Math.floor(max));
        }
        console.log(usedWords);
  

crossWordPuzzleGenerator.js

             function CrosswordPuzzle()
        {
            const emptyCell = '_';
            let grid = Array.from(Array( gridSize ), () => new Array( gridSize ))
            for( let row = 0; row < gridSize; row   )
            {
                for( let column = 0; column < gridSize; column   )
                {
                    grid[row][column] = emptyCell;
                }
            }

            let update = function( word )
            {
                let updated = false;
                if( canBePlaced( word ))
                {
                    addWord( word );
                    updated = true;
                }

                return updated;
            }

            let canBePlaced = function( word )
            {
                let canBePlaced = true;
                if( isValidPosition( word.row, word.column ) amp;amp;  fitsOnGrid( word ) )
                {
                    let index = 0;
                    while( index < word.text.length )
                    {
                        let currentRow = word.vertical ? word.row   index : word.row;
                        let currentColumn = !word.vertical ? word.column   index : word.column;

                        if( ( word.text.charAt( index ) === grid[currentRow][currentColumn] ||
                            emptyCell === grid[currentRow][currentColumn] ) amp;amp;
                            placementLegal( word, currentRow, currentColumn) )
                        {
                            /* words */
        let words = [
            'احتمال',
            'مصارع',
            'متهور',
            'تفكير',
            'مستودع',
            'رياضي',
            'موقف',
            'مقاوم',
            'يطير',
            'جميلة',
            'تاريخ',
            'مراكش',
            'مستقبل',
            'صاع',
            'نافذة',
            'متحرر',
            'مفقود',
            'مستطيل',
            'سعادة',
            'صيد',
            'كلاب',
            'دولار',
            'ناقوس',
            'مواطن',
            'طرب',
            'داخل',
            'ذئب',
            'طائر',
            'ذهب',
            'دماغ',
            'مذهب',
            'قائد',
            'مسؤول',
            'متعدد',
            'يستاؤون',
            'ولد',
            'رؤوس',
            'ريح',
            'عقاب',
            'طفلة',
            'مجرة',
            'جزيرة',
            'تننين',
            'فندق',
            'حاسة',
            'عرض',
            'موقف',
            'مغارة',
            'يستورد',
            'حزن',
            'يوم',
            'غرفة',
            'محامي',
            'قديس',
            'اسود',
            'يقاوم',
            'حروف',
            'احلام',
            'اقطاعي',
            'سترة',
            'مديونية',
            'استيراد',
            'مقاتل',
            'وساخة',
            'انتقادات',
            'عادل',
            'لجين',
            'مستعصية',
            'جمارك',
            'ريحان',
            'مواقيت',
            'ناموس',
            'اعتيادي',
            'جوعان',
            'مغناطيس',
            'استوزار',
            'بنزين',
            'رمز',
            'تعاويذ',
            'تمساح',
            "قاطور",
            "بنفسجي",
            "استعدادات",
            "اليمينيوم",
            "كروموسومات",
            "انتيخريسطوس",
            "الأيام",
            "إزميل",
            "داروين",
            "ليس",
            "بلاستيك",
            "لاتفيا",
            "على",
            "من",
            "الى",
            "من",
            "السودان",
            "في",
            "غشت",
            "شعبان",
            "ريحان",
            "حديد",
            "طواف",
            "رمادي",
            "هيونداي",
            "جمباز",
            "نمر",
            "اسرافيل",
            "بطاطس",
            "صفصاف",
            "بطيخ",
            "بطريق",
            "قرش"
        ]; 
                        }
                        else
                        {
                            canBePlaced = false;
                        }
                        index  ;
                    }
                }
                else
                {
                    canBePlaced = false;
                }

                return canBePlaced;
            }

            let getIntersections = function()
            {
                let intersections = 0;
                for (let row = 0; row < gridSize; row  )
                {
                    for (let column = 0; column < gridSize; column  )
                    {
                        if ( isLetter( row, column ) )
                        {
                            if ( isValidPosition( row - 1, column ) amp;amp;
                                isValidPosition( row   1, column ) amp;amp;
                                isValidPosition( row, column - 1 ) amp;amp;
                                isValidPosition( row, column   1 ) amp;amp;
                                isLetter( row - 1, column ) amp;amp;
                                isLetter( row   1, column ) amp;amp;
                                isLetter( row, column - 1 ) amp;amp;
                                isLetter( row, column   1 ) )
                            {
                                  intersections;
                            }
                        }
                    }
                }
                return intersections;
            }

            let placementLegal = function( word, row, column )
            {
                let illegal = false;
                if( word.vertical )
                {
                    illegal = isInterference( row, column   1, row   1, column ) ||
                            isInterference( row, column - 1, row   1, column  ) ||
                            overwritingVerticalWord( row, column ) ||
                            invadingTerritory( word, row, column );

                }
                else
                {
                    illegal = isInterference( row   1, column, row, column   1 ) ||
                            isInterference( row - 1, column, row, column   1  ) ||
                            overwritingHorizontalWord( row, column ) ||
                            invadingTerritory( word, row, column );

                }
                return !illegal;
            }

            let invadingTerritory = function( word, row, column )
            {
                let invading = false;
                let empty = isEmptyCell( row, column )
                if( word.vertical )
                {
                    let weHaveNeighbors = ( doesCharacterExist( row, column - 1 ) ||
                                            doesCharacterExist( row, column   1 ) ) ||
                                            endOfWord( word, row, column ) amp;amp; 
                                            doesCharacterExist( row   1, column );

                    invading = empty amp;amp; weHaveNeighbors;                
                }
                else
                {
                    let weHaveNeighbors = ( doesCharacterExist( row - 1, column ) ||
                                            doesCharacterExist( row   1, column ) ) ||
                                            endOfWord( word, row, column ) amp;amp; 
                                            doesCharacterExist( row, column   1 );

                    invading = empty amp;amp; weHaveNeighbors;
                }
                return invading;
            }

            let endOfWord = function( word, row, column )
            {
                if( word.vertical )
                {
                    return word.row   word.text.length - 1 === row;
                }
                else
                {
                    return word.column   word.text.length - 1 === column;
                }
            }

            let doesCharacterExist = function( row, column )
            {
                return isValidPosition( row, column ) amp;amp; 
                    isLetter( row, column );
            }

            let overwritingHorizontalWord = function( row, column )
            {
                let leftColumn = column - 1;
                return ( isValidPosition( row, leftColumn ) amp;amp; 
                        isLetter( row, column ) amp;amp; 
                        isLetter( row, leftColumn ) );
            }

            let overwritingVerticalWord = function( row, column )
            {
                let rowAbove = row - 1;
                return ( isValidPosition( rowAbove, column ) amp;amp; 
                        isLetter( row, column ) amp;amp; 
                        isLetter( rowAbove, column ) );
            }

            let isInterference = function( row, column, nextRow, nextColumn )
            {
                return isValidPosition( row, column ) amp;amp;
                    isValidPosition( nextRow, nextColumn ) amp;amp;
                    isLetter( row, column ) amp;amp;
                    isLetter( nextRow, nextColumn );    
            }

            let isLetter = function( row, column)
            {
                return grid[row][column] !== emptyCell;
            }

            let isEmptyCell = function( row, column )
            {
                return !isLetter( row, column );
            }

            let addWord = function( word )
            {
                for (let letterIndex = 0; letterIndex < word.text.length;   letterIndex)
                {
                    let row = word.row;
                    let column = word.column;
                    if ( word.vertical )
                    {
                        row  = letterIndex;
                    }
                    else
                    {
                        column  = letterIndex;
                    }

                    grid[row][column] = word.text.substring( letterIndex, letterIndex   1 );
                }
            }

            let fitsOnGrid = function( word )
            {
                if( word.vertical )
                {
                    return word.row   word.text.length <= gridSize;
                }
                else
                {
                    return word.column   word.text.length <= gridSize;
                }
            }

            let isValidPosition = function( row, column )
            {
                return row >= 0 amp;amp; row < gridSize amp;amp; column >= 0 amp;amp; column < gridSize;
            }

            return { 
                "grid": grid, 
                "update": update, 
                "isLetter": isLetter, 
                "getIntersections": getIntersections
            };
        }
  

word.js

         function Word( text, row, column, vertical )
    {
        this.text = text;
        this.row = row;
        this.column = column;
        this.vertical = vertical;
    }
  

words.js

         let words = [
        'احتمال',
        'مصارع',
        'متهور',
        'تفكير',
        'مستودع',
        'رياضي',
        'موقف',
        'مقاوم',
        'يطير',
        'جميلة',
        'تاريخ',
        'مراكش',
        'مستقبل',
        'صاع',
        'نافذة',
        'متحرر',
        'مفقود',
        'مستطيل',
        'سعادة',
        'صيد',
        'كلاب',
        'دولار',
        'ناقوس',
        'مواطن',
        'طرب',
        'داخل',
        'ذئب',
        'طائر',
        'ذهب',
        'دماغ',
        'مذهب',
        'قائد',
        'مسؤول',
        'متعدد',
        'يستاؤون',
        'ولد',
        'رؤوس',
        'ريح',
        'عقاب',
        'طفلة',
        'مجرة',
        'جزيرة',
        'تننين',
        'فندق',
        'حاسة',
        'عرض',
        'موقف',
        'مغارة',
        'يستورد',
        'حزن',
        'يوم',
        'غرفة',
        'محامي',
        'قديس',
        'اسود',
        'يقاوم',
        'حروف',
        'احلام',
        'اقطاعي',
        'سترة',
        'مديونية',
        'استيراد',
        'مقاتل',
        'وساخة',
        'انتقادات',
        'عادل',
        'لجين',
        'مستعصية',
        'جمارك',
        'ريحان',
        'مواقيت',
        'ناموس',
        'اعتيادي',
        'جوعان',
        'مغناطيس',
        'استوزار',
        'بنزين',
        'رمز',
        'تعاويذ',
        'تمساح',
        "قاطور",
        "بنفسجي",
        "استعدادات",
        "اليمينيوم",
        "كروموسومات",
        "انتيخريسطوس",
        "الأيام",
        "إزميل",
        "داروين",
        "ليس",
        "بلاستيك",
        "لاتفيا",
        "على",
        "من",
        "الى",
        "من",
        "السودان",
        "في",
        "غشت",
        "شعبان",
        "ريحان",
        "حديد",
        "طواف",
        "رمادي",
        "هيونداي",
        "جمباز",
        "نمر",
        "اسرافيل",
        "بطاطس",
        "صفصاف",
        "بطيخ",
        "بطريق",
        "قرش"
    ];
  

мои новые данные words1.js

         let words = [
        {
            qId: "01",
                    question: "من التماسيح",
            value: "قاطور"
        },
        {
            qId: "02",
                    question: "من الألوان",
            value: "بنفسجي"
        },
        {
            qId: "03",
                    question: "من كتب أحمد مصطفى",
            value: "أنتيخريسطوس"
        },
        {
            qId: "04",
                    question: "من كتب طه حسين",
            value: "الأيام"
        },
        {
            qId: "05",
                    question: "من أدوات النجارة",
            value: "إزميل"
        },
        {
            qId: "06",
                    question: "صحب نظرية التطور",
            value: "داروين"
        },
        {
            qId: "07",
                    question: "من أخوات كان",
            value: "ليس"
        },
        {
            qId: "08",
                    question: "مادة بترولية",
            value: "بلاستيك"
        },
        {
            qId: "09",
                    question: "دولة أروبية",
            value: "لاتفيا"
        },
        {
            qId: "10",
                    question: "من حروف الجر",
            value: "على"
        },{
            qId: "11",
                    question: "من حروف الجر",
            value: "من"
        },
        {
            qId: "12",
                    question: "من حروف الجر",
            value: "الى"
        },
        {
            qId: "13",
                    question: "من حروف الجر",
            value: "من"
        },
        {
            qId: "14",
                    question: "دولة عربية",
            value: "السودان"
        },
        {
            qId: "15",
                    question: "من حروف الجر",
            value: "في"
        },
        {
            qId: "16",
                    question: "من الشهور الميلادية",
            value: "غشت"
        },
        {
            qId: "17",
                    question: "من الشهور العربية",
            value: "شعبان"
        },
        {
            qId: "18",
                    question: "من الورود",
            value: "ريحان"
        },
        {
            qId: "19",
                    question: "من المعادن",
            value: "حديد"
        },
        {
            qId: "20",
                    question: "من مناسك الحج",
            value: "طواف"
        },{
            qId: "21",
                    question: "من الألوان",
            value: "رمادي"
        },
        {
            qId: "22",
                    question: "من السيارات",
            value: "هيونداي"
        },
        {
            qId: "23",
                    question: "من الرياضات",
            value: "جمباز"
        },
        {
            qId: "24",
                    question: "من السنوريات",
            value: "نمر"
        },
        {
            qId: "25",
                    question: "من الملائكة",
            value: "اسرافيل"
        },
        {
            qId: "26",
                    question: "من الخضر",
            value: "بطاطس"
        },
        {
            qId: "27",
                    question: "من الأشجار",
            value: "صفصاف"
        },
        {
            qId: "28",
                    question: "من الفواكه",
            value: "بطيخ"
        },
        {
            qId: "29",
                    question: "من االطيور",
            value: "بطريق"
        },
        {
            qId: "30",
                    question: "من االاسماك",
            value: "قرش"
        }
    ]
  

Комментарии:

1. Добро пожаловать в SO, вы упомянули, что получаете много ошибок. Какие ошибки вы получаете?

2. crosswordpuzzle.js:359 Неперехваченная ошибка типа: не удается прочитать свойство ‘length’ неопределенного

3. в fitsOnGrid (crosswordpuzzle.js:359) в canBePlaced (crosswordpuzzle.js:28) в Object.update (crosswordpuzzle.js:16)

4. в generateGrids (crosswordpuzzlegenerator.js: 106) в createCrossWordPuzzle (crosswordpuzzlegenerator.js:166) в HTMLButtonElement.onclick (crosswordpuzzlegenerator.html:17)

5. Чао, я понимаю вашу проблему: по сути, вам нужно изменить все строки, в которых вы вызываете words.filter , на что-то, что принимает новую форму данных. Но таким образом помочь вам невозможно. Слишком много кода для отладки. У вас есть репозиторий github для совместного использования? codesandbox? Есть с чем поработать…