Javascript 从两个数组中找到相似的字符串(obj.key),arr[{},{}]arr2[{},{}],然后将checked属性设置为true

Javascript 从两个数组中找到相似的字符串(obj.key),arr[{},{}]arr2[{},{}],然后将checked属性设置为true,javascript,angularjs,angularjs-material,Javascript,Angularjs,Angularjs Material,谢谢你抽出时间。有两个数组,arr是html页面中的下拉列表,可以是多选。提交时,控制器对从arrcommodity=counciles\u item.replace(/(.*)\u/,a=>“”)获取的选定值执行操作,并最终生成一个新数组,其格式为arr2。这导致arr中的一些单词是由arr2中商品中的单词组成的。如arr2中的ITPSM类似于arr中的TechProd\u ITPSM。我如何在arr中找到与元素arr2/商品类似的元素或与元素相同的元素,如旅行。并将相应的项目选中的属性值设置

谢谢你抽出时间。有两个数组,arr是html页面中的下拉列表,可以是多选。提交时,控制器对从arrcommodity=counciles\u item.replace(/(.*)\u/,a=>“”)获取的选定值执行操作,并最终生成一个新数组,其格式为arr2。这导致arr中的一些单词是由arr2中商品中的单词组成的。如arr2中的ITPSM类似于arr中的TechProd\u ITPSM。我如何在arr中找到与元素arr2/商品类似的元素或与元素相同的元素,如旅行。并将相应的项目选中的属性值设置为true?我用的是angularjs和angular材质。万分感谢。顺便说一下,下面也是html的一部分

var arr = [
    { label: 'Techod_ITSM', checked: false },
    { label: 'Techod_Teco', checked: false },
    { label: 'Techod_Connectivity', checked: false },
    { label: 'Services_CF', checked: false },
    { label: 'Technical Services', checked: false },
    { label: 'Travel', checked: false },
    { label: 'Marketing & solutions', checked: false },
    { label: 'All', checked: false },
    { label: 'facility Solution Services', checked: false }
];
var arr2 = [
    { "Marketing & Communications": true },
    { "All": true },
    { "Travel": true },
    { "Technical Products": true, "commodities": ["ITSM", "Teco", "Connectivity"] },
    { "Services": true, "commodities": ["CF", "Technical Services"] }
];

<form name="userForm" novalidate ng-submit="userForm.$valid &&  userProject.createProject()"> 
<md-select ng-model="userProject.project_councils" multiple="true">
 <md-option ng-value="project_councils" ng-repeat="project_councils in project_councilss" ng-selected="project_councils.checked">{{project_councils.label}}
</md-option></md-select>
<md-button type="submit" id="createProject" value="Submit" class="md-raised md-primary" aria-label="Create" > Submit
</md-button>
var-arr=[
{标签:'Techod_ITSM',选中:false},
{标签:“Techod_Teco”,选中:false},
{标签:'Techod_Connectivity',选中:false},
{label:'Services_CF',选中:false},
{标签:“技术服务”,勾选:false},
{标签:'Travel',选中:false},
{标签:'Marketing&solutions',选中:false},
{标签:'All',选中:false},
{标签:“设施解决方案服务”,选中:false}
];
var arr2=[
{“营销与传播”:正确},
{“所有”:正确},
{“旅行”:真的},
{“技术产品”:正确,“商品”:[“ITSM”、“Teco”、“连接”]},
{“服务”:正确,“商品”:[“CF”,“技术服务”]}
];
{{project_councils.label}
提交

更改
事件的
中,您可以使用
for..of
循环迭代
arr2
数组,迭代每个对象属性,使用
object.entries()
,检查属性值是否包含所选
的文本,使用
RegExp
/[A-Z]+/g
匹配大写字母,后跟一个或多个小写字母;如果属性是
“商品”
,则将对象的数组值连接到当前
“标签”
,作为带有
.join(“”
)的字符串;如果
arr
属性包含与
使用相同的
RegExp
选择
值的匹配项,则使用
循环的
对象.entries()
迭代
arr
属性,将
当前索引中
arr
选中的
设置为

var-arr=[
{标签:'TechProd_ITPSM',选中:false},
{标签:'TechProd_Telco',选中:false},
{标签:'TechProd_Connectivity',选中:false},
{标签:'Services_CWF',选中:false},
{标签:“技术服务”,勾选:false},
{标签:'TechProd_Telco',选中:false},
{标签:'Travel',选中:false},
{标签:'Marketing&solutions',选中:false},
{标签:'All',选中:false},
{标签:“设施解决方案服务”,选中:false}
];
var arr2=[
{“营销与传播”:正确},
{“所有”:正确},
{“旅行”:真的},
{“技术产品”:正确,“商品”:[“ITPSM”、“电信”、“连接”]},
{“服务”:正确,“商品”:[“CWF”、“商业服务”、“技术服务”]}
];
const select=document.querySelector(“select”);
常数re=/[A-Z][A-Z]+//g;
select.onchange=()=>{
const val=select.value.match(re);
过滤器:用于(arr2的let prop){
for(让Object.entries(prop))的[key,value,c]{
if(新RegExp(val.join(“|”).test(键)){
如果(/productions/.test(key))c=value.join(“”);
for(让Object.entries(arr)的[index,{label}]{
arr[index][“checked”]=new RegExp(label.concat(c | | |“”).match(re)
.join(“|”).test(选择.value);
}              
}
}
}
控制台日志(arr);
}
for(让arr的{label,checked}){
让选项=新选项(标签,标签);
option.selected=选中;
选择.appendChild(选项);
}

选择一个选项
修复。使用forEach获取所有商品,然后使用map和reduce处理“join”字符串“TechProd_ITPSM”,将选中的值设置为true。 有更好的办法。欢迎你的任何想法

var selectedCom = "";
            var selectedComArr = [];
            feedbackProject.project_councils.forEach(function(resCouncils) {
                var resCommodities = resCouncils.commodities;
                if (resCommodities) {
                    resCommodities.forEach(function(resComItem) {
                        if ((resComItem == "ITPSM") || (resComItem == "Telco") || (resComItem == "Connectivity")) {
                            selectedCom = "TechProd_" + resComItem;
                            selectedComArr.push(selectedCom);
                        } else if ((resComItem == "CWF") || (resComItem == "Business Services") || (resComItem == "Technical Services")) {
                            selectedCom = "Services" + resComItem;
                            selectedComArr.push(selectedCom);
                        }
                    });
                } else {
                    selectedComArr.push(Object.keys(resCouncils)[0]);
                }
                console.log(selectedComArr);
            });

            function reducer(map, that) {
                map[that.label] = that;
                return map;
            }

            function getMapper(map) {
                return function(item) {
                    var temp = map[item];
                    if (temp && temp.label === item) {
                        temp.checked = true;
                    }
                }
            }

            function checkSelected(arr, arr2) {
                var map = arr.reduce(reducer, {});
                arr2.map(getMapper(map));

            };

嗨,AJT_82,我能理解你的方法,但目前不熟悉这些功能。因此,我尝试选择TechProd_ITPSM,但所有TechProd_Telco和TechProd_Connectivity checked属性都设置为true。理想的结果是仅检查了元件TechProd_ITPSM。另外两个应该是假的。你能帮我进一步看看吗?“我怎样才能找到arr中相似的元素”你为什么在问题中包含“相似”一词?@TammyShi你只是想根据选择和
arr
单独将
checked
设置为
true
at
arr
arr2
在程序中扮演什么角色?我使用angular material md select for user从下拉列表中选择多个值,并在用户执行编辑操作时从DB获得一个结果。如果响应的arr2中存在dorpdown中的项,则尝试将checked属性设置为true。我使用了track by$value:id,但不知道如何使其适用于多个选择。这是我的另一个问题。理事会{{project_Councils.label}