Javascript 转换分隔字符串和对象数组

Javascript 转换分隔字符串和对象数组,javascript,arrays,angularjs,angular-nglist,Javascript,Arrays,Angularjs,Angular Nglist,如何使用数据绑定在带分隔符的字符串和对象数组之间进行转换 将使用字符串数组。但是我有一个对象数组,我想在其中对文本属性进行定界,以便数组中的文本可以编辑 用于字符串数组: $scope.arrayStrings=[“一”、“二”、“三”]; 如何使其与对象一起工作: $scope.arrayObjects=[{ 正文:“一”, 所选:真 }, { 文本:“两个”, 所选:真 }, { 正文:“三”, 所选:真 }]; 我的一个可能想法是在字符串数组上使用ng列表,然后将其映射到对象

如何使用数据绑定在带分隔符的字符串和对象数组之间进行转换

将使用字符串数组。但是我有一个对象数组,我想在其中对文本属性进行定界,以便数组中的文本可以编辑

用于字符串数组

$scope.arrayStrings=[“一”、“二”、“三”];

如何使其与对象一起工作

$scope.arrayObjects=[{
正文:“一”,
所选:真
}, {
文本:“两个”,
所选:真
}, {
正文:“三”,
所选:真
}];


我的一个可能想法是在字符串数组上使用ng列表,然后将其映射到对象数组。使用
$watch
在字符串数组更改时更新对象数组。但是,这仍然不够,因为它将在每次阵列更新时覆盖对象上的任何其他属性。(先前plunker版本中的演示)

$scope.$watch('arrayStrings',function(){
$scope.arrayObjects=$scope.arrayStrings.map(函数){
返回{
文本:s,
所选:真
}
});
})

更新: 使用
ng list
时似乎仍然存在问题,即使使用:

重写
toString
方法有助于最初显示对象集,但只要键入任何内容,
ng list
就会将对象集转换回字符串数组,因为此时
toString
尚未发挥作用

澄清我想做什么。我真的想要一个对象列表,带有可编辑的标题,也可以选择。即使标题已更改或项目已添加,我也希望保留选择

JavaScript使用方法
toString()
来表示文本值。默认情况下,
toString()
方法由对象派生的每个对象继承。如果未在自定义对象中重写此方法,则toString()返回
“[对象类型]”
,其中type是对象类型

覆盖toSting() 方法`toSting()可以像JavaSctript中的几乎所有内容一样被覆盖

$scope.arrayObjects = $scope.arrayStrings.map(function(s){
    return {
        text: s,
        selected: true,
        toString: function() {
            return '{text: "' + s + '"}' // this will be returned instead of [object Object]
        }
    }
});
虽然这很有帮助,但我无法使绑定与
ng list
一起工作,因为
ng list
总是将对象数组转换为字符串数组,从而覆盖范围中的所有对象

在本例中,最简单的方法是从ng列表升级到具有完全对象支持的列表,如大多数标记库:

我实现了ngTagsInput,如下所示:

HTML


JavaScript

$scope.arrayObjects=[
{“text”:“one”,“selected”:false},
{“text”:“two”,“selected”:false},
{“文本”:“三”,“选定”:假}
];
这样,每个对象都会被赋予自己的元素,在该元素中显示文本属性,并将它们一起格式化,以在输入中生存。更改一个对象只会更新单个元素


方法toString()应该对您有所帮助–@Krzysztof Safjanowski,将其作为一个答案发布,它确实具有教育意义!谢谢@Ryeball的启发谢谢你的建议。尽管如此,每当我键入任何内容时,它仍然会覆盖列表。我用澄清更新了我的问题。我认为
ng list
正在转换每个逗号分隔的条目,而不管
toString
方法是什么。
$scope.arrayObjects = $scope.arrayStrings.map(function(s){
    return {
        text: s,
        selected: true,
        toString: function() {
            return '{text: "' + s + '"}' // this will be returned instead of [object Object]
        }
    }
});