gpt4 book ai didi

javascript - 当键为 'is.a.string' 时,如何在嵌套对象中获取/设置值?

转载 作者:行者123 更新时间:2023-12-02 16:15:55 25 4
gpt4 key购买 nike

我正在一个 Angular 应用程序中工作,其中我正在传递一个对象和一个点表示法的字符串。例如:

$scope.obj = {
x: 1,
y: 'a',
z: {
eks: 1,
why: 'a',
zee: 'orange you glad i didn\'t say banana'
}
};
$scope.key = 'z.zee'

我希望能够从对象中获取键的值。由于 key 是一个字符串,我必须构建一个函数

$scope.getValue = function (object, expression) {
return $parse(expression)(this, object);
};

函数获取值,但现在我需要能够将 obj.z.zee 设置为其他内容,但我做不到

$scope.getValue($scope.obj, "z.zee.punchLine") = 'something else';

$scope.val = $scope.getValue($scope.obj, "z.zee.punchLine");
$scope.val = 'something else';

第一个是错误,第二个只会改变val。

我尝试创建一个不依赖于 Angular 解析的函数,但它也没有帮助

function getValue(object, expression) {
var expresionList = expression.split('.');
var value = object;
for(var index = 0; index < expresionList.length; index++) {
value = value[expresionList[index]];
}
return value
}

当对象的点路径是字符串时,有没有办法写回对象?

这是一个 Plunker 和要玩的片段。

angular.module('SimpleApp', [])
// Attribute Isolated Scope
.controller('simpleCtrl', function($scope, $parse) {
$scope.testCtrlScope = 'test controller scope';
$scope.obj = {
x: 1,
y: 'a',
z: {
eks: 1,
why: 'a',
zee: {
punchLine: 'orange you glad i didn\'t say banana'
}
}
};
$scope.getValue = function(object, expression) {
return $parse(expression)(this, object);
};
//alt get value
// $scope.getValue = function (object, expression) {
// var expresionList = expression.split('.');
// var value = object;
// for(var index = 0; index < expresionList.length; index++) {
// value = value[expresionList[index]];
// }
// return value;
// };
$scope.val = $scope.getValue($scope.obj, "z.zee.punchLine");
console.log($scope.val, $scope.getValue($scope.obj, "z.zee.punchLine"));
$scope.val = 'something';
console.log($scope.val, $scope.getValue($scope.obj, "z.zee.punchLine"));
});
<div ng-app="SimpleApp">
<div ng-controller="simpleCtrl">
{{testCtrlScope}}
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

编辑:多尔特的回答有效。这是我如何让它以 Angular 工作

$scope.setValue = function(object, expression, value) {
var firstPart = expression.substr(0, expression.lastIndexOf('.'));
var obj;
var setterKey;
if (firstPart) {
setterKey = expression.substr(expression.lastIndexOf('.') + 1);
obj = $parse(firstPart)(this, object);
} else {
obj = object;
setterKey = expression;
}
obj[setterKey] = value;
};

最佳答案

虽然我建议不要这样做*,但这里有一个解决方案:

var data = { 
a:{
b:{
c:'hello'
}
}
}

var path = 'a.b.c';
var parts = path.split('.');
var result = parts.reduce(function(soFar,element){
return soFar[element];
},data);

这会将“hello”放入结果变量中。

编辑:分配值:如果此引用值是一个对象,则可以分配给以这种方式提取的引用。否则(对于值类型)那就更麻烦了,你必须在最后一次迭代之前停止这个循环,并访问引用作为倒数第二个对象的 value 属性。

* 为什么我建议反对它:从长远来看,这种路径表示将成为一场噩梦,它的特殊语义会在您的应用程序中创建紧密耦合,即。每个使用此代码的人都必须了解如何解析此字符串。

关于javascript - 当键为 'is.a.string' 时,如何在嵌套对象中获取/设置值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29604740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com