অ্যাঙ্গুলারজেএস-এ অবজেক্টের অ্যারে থেকে আইডি দ্বারা নির্দিষ্ট অবজেক্টটি পান


111

আমার একটি জেএসওএন ফাইল রয়েছে যাতে আমি আমার অ্যাংুলারজেএস ওয়েবসাইটে অ্যাক্সেস করতে চাই some এখন আমি যা চাই তা হচ্ছে অ্যারে থেকে কেবল একটি অবজেক্ট। সুতরাং আমি আইডি 1 সহ আইটেমটি পছন্দ করি।

ডেটা দেখতে এমন দেখাচ্ছে:

{ "results": [
    {
        "id": 1,
        "name": "Test"
    },
    {
        "id": 2,
        "name": "Beispiel"
    },
    {
        "id": 3,
        "name": "Sample"
    }
] }

আমি AngularJS $ http এর মতো কার্যকারিতা সহ ডেটা লোড করতে চাই:

$http.get("data/SampleData.json");

যা কাজ করছে তবে আমি এখন যে অ্যারে থেকে পাই তা একটি নির্দিষ্ট ডেটা অবজেক্ট (আইডি দ্বারা) $http.getকীভাবে পাব ?

আপনার সাহায্যের জন্য আগাম ধন্যবাদ।

শুভেচ্ছা মার্ক


আপনি কি নিজেই গিয়েছেন? যদি তা হয় তবে আমরা কী দেখতে এসেছি?
সিমোনচিল্ডস

1
আংগুলারজেএস ব্যবহার করে কোন উপায়ে সেরা হবে তা আমার কোনও ধারণা নেই। আমি যা পছন্দ করি না তা হ'ল অ্যারের উপরে পুনরাবৃত্তি করা এবং আইডির সমান কাজ করা। আরও ভাল উপায় আছে?
mooonli

এই জাতীয় প্রক্রিয়াকরণের জন্য আপনার আন্ডারস্কোর বা অনুরূপ লাইব্রেরির উপর নির্ভর করা উচিত। অ্যাঙ্গুলারজেএস এমভিভিএম কাঠামো এবং এটির জন্য এপিআই নাও থাকতে পারে।
বিজয় পান্ডে

@ মার্কবাউর - আপনাকে অ্যারেটি পুনরাবৃত্তি করতে হবে। এমনকি যদি আপনি আন্ডারস্কোর বা অন্য কিছু অনুরূপ ব্যবহার করেন তবে এটি ফাংশনগুলি, পর্দার আড়ালে কেবল পুনরাবৃত্তি হয়।
অ্যাডাম

1
দয়া করে
এটির

উত্তর:


4

এটি করার একমাত্র উপায় হ'ল অ্যারের মাধ্যমে পুনরাবৃত্তি করা। স্পষ্টতই যদি আপনি নিশ্চিত হন যে ফলাফলগুলি আইডির মাধ্যমে অর্ডার করা হয়েছে তবে আপনি বাইনারি অনুসন্ধান করতে পারেন


46
... আমি সত্যিই আশা করি এই উত্তরটি পড়ার পরে লোকেরা মনে হয় না যে অ্যারে বাছাই করা ভাল, তবে বাইনারি অনুসন্ধান করা ভাল ধারণা। বাইনারি অনুসন্ধান চতুর , নিশ্চিত, তবে কেবল অ্যারেটি বাছাই করা থাকলে এবং বাস্তবে হ'ল: 1. খারাপভাবে প্রয়োগ করা সহজ, ২. খারাপভাবে প্রয়োগ করা হয়েছে কিনা, পড়ার পক্ষে আরও শক্ত।
বেন লেশ

4
ডাউনটাভোটাররা যদি তাদের সিদ্ধান্তটি অনুপ্রাণিত করতে পারে তবে আমি অত্যন্ত প্রশংসা করব।
আন্তোনিও ই।

1
ডিফল্ট জাভাস্ক্রিপ্ট অ্যারে টাইপ পদ্ধতি আবিষ্কার () আছে। সন্ধান () পদ্ধতিটি অ্যারেতে প্রথম উপাদানটির মান প্রদান করে যা সরবরাহিত পরীক্ষামূলক ক্রিয়াকে সন্তুষ্ট করে।
abosancic

246

ES6 সমাধান ব্যবহার করে

যারা এখনও এই উত্তরটি পড়ছেন তাদের জন্য, আপনি যদি ES6 ব্যবহার করছেন তবে findপদ্ধতিটি অ্যারেতে যুক্ত করা হয়েছিল। সুতরাং একই সংগ্রহটি ধরে নিলে সমাধানটি হ'ল:

const foo = { "results": [
    {
        "id": 12,
        "name": "Test"
    },
    {
        "id": 2,
        "name": "Beispiel"
    },
    {
        "id": 3,
        "name": "Sample"
    }
] };
foo.results.find(item => item.id === 2)

আমি এখন পুরোপুরি এই সমাধানের জন্য যাব, যেমন কৌণিক বা অন্য কোনও কাঠামোর সাথে কম বাঁধা। খাঁটি জাভাস্ক্রিপ্ট।

কৌণিক সমাধান (পুরানো সমাধান)

নিম্নলিখিতটি করে এই সমস্যাটি সমাধান করার লক্ষ্য নিয়েছি:

$filter('filter')(foo.results, {id: 1})[0];

ব্যবহারের ক্ষেত্রে উদাহরণ:

app.controller('FooCtrl', ['$filter', function($filter) {
    var foo = { "results": [
        {
            "id": 12,
            "name": "Test"
        },
        {
            "id": 2,
            "name": "Beispiel"
        },
        {
            "id": 3,
            "name": "Sample"
        }
    ] };

    // We filter the array by id, the result is an array
    // so we select the element 0

    single_object = $filter('filter')(foo.results, function (d) {return d.id === 2;})[0];

    // If you want to see the result, just check the log
    console.log(single_object);
}]);

প্লাঙ্কার: http://plnkr.co/edit/5E7FYqNNqDuqFBlyDqRh?p= পূর্বরূপ


1
আসলে, আমি এটা মনে করি! অ্যারে আনার পরে, আপনি সঠিক আইডি দিয়ে আইটেমটি ফিল্টার করতে $ ফিল্টার ফাংশনটি ব্যবহার করতে পারেন।
ফ্লপ

10
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আমার মাথায়ও একই প্রশ্ন ছিল এবং এই উত্তরটি কেবলমাত্র বিদ্যমান অ্যাঙ্গুলারজেএস ব্যবহার করে এবং চাকাটি পুনরায় উদ্ভাবন করছে না। এবং হ্যাঁ, এটি কাজ করছে।
জোড়ান পি।

4
এটি গ্রহণযোগ্য উত্তর হওয়ার জন্য +1। কৌণিক গ্রন্থাগার ব্যবহার করে সেরা সমাধান।
মেকি

1
একটি অভিব্যক্তিতে ফিল্টার সহ প্লাঙ্কার: plnkr.co/edit/yc0uZejGqWTcUVKvI7Tq?p= পূর্বরূপ
অ্যারন রোলার

4
সাবধান থাকুন যে ফিল্টারগুলি ডিফল্টরূপে সংবেদনশীল সাবস্ট্রিংগুলিতে কেস দ্বারা সন্ধান করে। সুতরাং (foo.results, {id: 2}) [{id: 12}, {id: 2}], {id: 222}] তবে (foo.results, ফাংশন (d) {রিটার্ন d.id == = 2;}) ফিরে আসে [{আইডি: 2 returns]
রায়ান.লে

26

এই পুরানো পোস্টটির দিকে তাকানো যে কোনও ব্যক্তির জন্য, এটি বর্তমানে এটি করার সবচেয়ে সহজ উপায়। এটা শুধুমাত্র একটি AngularJS প্রয়োজন $filter। এটি উইলমোয়েসের উত্তর মত, তবে খাটো এবং বুঝতে সহজ easier

{ 
    "results": [
        {
            "id": 1,
            "name": "Test"
        },
        {
            "id": 2,
            "name": "Beispiel"
        },
        {
            "id": 3,
            "name": "Sample"
        }
    ] 
}

var object_by_id = $filter('filter')(foo.results, {id: 2 })[0];
// Returns { id: 2, name: "Beispiel" }

সতর্কতামূলক

যেমন @ এমএমজিএন বলেছে, এটি সঠিকভাবে কাজ করে না । এটি আরও ফলাফল ধরবে। উদাহরণ: আপনি যখন 3 অনুসন্ধান করবেন তখন এটি 23 টিও ধরবে


1
আইডি: 24 12 222 2002 ইত্যাদি
mpgn

আমি মনে করি যে [0]সংগ্রহটি এটি আবিষ্কার করে এটি প্রথম ফলাফলটি ফিরিয়ে আনবে, সুতরাং এটি কেবল তখনই কাজ করবে যদি আপনার সংগ্রহটি বাছাই করা হয় এবং আপনি যে জিনিসটির সন্ধান করছেন এটি তার পুনরাবৃত্তির সময় এটি প্রথম খুঁজে পায়। যেমন। আইডি: 2 এর আগে যদি এমন একটি আইডি থাকে: 12, এটি আইডি ফিরে আসবে: 12
ফ্রিজেন মটর

25

ব্যক্তিগতভাবে আমি এই ধরণের স্টাফের জন্য আন্ডারস্কোর ব্যবহার করি ... তাই

a = _.find(results,function(rw){ return rw.id == 2 });

তারপরে "a" হ'ল সারিটি যা আপনি আপনার অ্যারের চেয়েছিলেন যেখানে আইডি 2 এর সমান


1
আমি সত্যিই আন্ডারস্কোরটি পছন্দ করি
জেনুইনফাফা

8
নোট করুন যে findসম্ভাব্যভাবে একাধিক বস্তু ফিরিয়ে দিতে পারে। যেহেতু আমরা কেবল একটি চাই, আমরা ব্যবহার করতে পারি findWhereযা কেবল প্রথম ঘটনাটি (যা আমরা জানি এটিই একমাত্র ঘটনা) প্রদান করে, যেমন a = _.findWhere(results, {id: 2})
গ্রেগলটসভ

16

আমি কেবল উইলেমোসের উত্তরে কিছু যুক্ত করতে চাই । এইচটিএমএলের অভ্যন্তরে সরাসরি লিখিত একই কোডটি দেখতে এইরকম হবে:

{{(FooController.results | filter : {id: 1})[0].name }}

ধরে নিই যে "ফলাফলগুলি" আপনার FooController এর একটি পরিবর্তনশীল এবং আপনি ফিল্টার করা আইটেমটির "নাম" বৈশিষ্ট্যটি প্রদর্শন করতে চান।


@ এনা-ফিল্টারের ফলাফল কীভাবে পরীক্ষা করবেন তা বাতিল বা অপরিজ্ঞাত নয়?
অভিজিৎ

আমি এই এইচটিএমএল বৈকল্পিকটি ব্যবহার করেছি কারণ আমি নিশ্চিত যে কোনও ফলাফলের অস্তিত্ব রয়েছে। আমি চেষ্টা করেছি এবং যদি কোনও ফলাফল না পাওয়া যায় তবে কনসোলটি কোনও ত্রুটি দেয় না, এটি কেবল পাঠ্যটি ফাঁকা ছেড়ে দেয়। যদি কোনও ফলাফল না পাওয়া যায় তবে আপনার যদি কিছু যুক্তি করার প্রয়োজন হয় তবে আমি মনে করি সবচেয়ে ভাল উপায় হ'ল উইলেমোস উত্তর (জেএস কোড নিয়ামকের অভ্যন্তরে)। সেই উদাহরণে, আপনার যদি এইচটিএমএলটি পরীক্ষা করা উচিত তবে সিঙ্গল_বজেক্ট ভেরিয়েবলটি নাল বা অপরিজ্ঞাত।
এনা

2
{{(FooController.results | ফিল্টার: {আইডি: 1}) [0] .নাম}: সত্য} - যদি কেউ কোনও সঠিক ম্যাচ সন্ধান করে
জর্জ শারভাদজে

12

আপনি ng-repeatকেবলমাত্র ডেটা ব্যবহার করতে বা বেছে নিতে পারেন যদি ডেটা আপনি যা ব্যবহার করে যা খুঁজছেন তার সাথে মেলে ng-show যেমন:

 <div ng-repeat="data in res.results" ng-show="data.id==1">
     {{data.name}}
 </div>    

2
আপনার অ্যারেতে যদি তুচ্ছ সংখ্যক আইটেমের বেশি থাকে তবে এটি প্রচুর পরিমাণে অপ্রয়োজনীয় স্কোপ তৈরি করবে যা আপনার অ্যাপ্লিকেশনটিকে ধীর করতে পারে।
ডিআইএমএম রিপার

9

আপনি কেবল আপনার অ্যারে লুপ করতে পারেন:

var doc = { /* your json */ };

function getById(arr, id) {
    for (var d = 0, len = arr.length; d < len; d += 1) {
        if (arr[d].id === id) {
            return arr[d];
        }
    }
}

var doc_id_2 = getById(doc.results, 2);

আপনি যদি এই অগোছালো লুপগুলি লিখতে না চান তবে আপনি আন্ডারস্কোর.জেএস বা লো-ড্যাশ (উদাহরণস্বরূপ) ব্যবহার করে বিবেচনা করতে পারেন :

var doc_id_2 = _.filter(doc.results, {id: 2})[0]

8

আপনি যদি স্টেট আইডির ভিত্তিতে শহরের মতো আইটেমের তালিকা চান তবে ব্যবহার করুন

var state_Id = 5;
var items = ($filter('filter')(citylist, {stateId: state_Id }));

7

দুর্ভাগ্যক্রমে (যতক্ষণ না আমি ভুল করে থাকি), আমি মনে করি ফলাফলের বিষয়টি নিয়ে আপনার পুনরাবৃত্তি হওয়া দরকার।

for(var i = 0; i < results.length; i += 1){
    var result = results[i];
    if(result.id === id){
        return result;
    }
}

কমপক্ষে এইভাবে এটি সঠিক মিলের আইডিটি খুঁজে পাওয়ার সাথে সাথে পুনরাবৃত্তির বাইরে চলে যাবে।


কেন? আপনার কি তা ব্যাক আপ করার কিছু আছে?
সিমোনচিল্ডস

11
আচ্ছা, তুমি কি জানো ..? আপনার যুক্তি পাল্টা ভাল অংশ এবং আমি - আমি শুধু পুনরায় পড়া জাভাস্ক্রিপ্ট গিয়েছিলাম বন্ধ am ভুল! এতক্ষণ আমি ভুল করে চলেছি! এটি এখনও আমার কোনও সমস্যা তৈরি করে নি ... তবুও। আমি আমার উত্তর আপডেট করেছি।
সিমোনচিল্ডস

6

কেন পরিস্থিতি জটিল? এই সহজ কিছু কিছু ফাংশন লিখুন:

function findBySpecField(data, reqField, value, resField) {
    var container = data;
    for (var i = 0; i < container.length; i++) {
        if (container[i][reqField] == value) {
            return(container[i][resField]);
        }
    }
    return '';
}

ব্যবহারের ক্ষেত্রে:

var data=[{
            "id": 502100,
            "name": "Bərdə filialı"
        },
        {
            "id": 502122
            "name": "10 saylı filialı"
        },
        {
            "id": 503176
            "name": "5 sayli filialı"
        }]

console.log('Result is  '+findBySpecField(data,'id','502100','name'));

আউটপুট:

Result is Bərdə filialı

4
$scope.olkes = [{'id':11, 'name':'---Zəhmət olmasa seçim edin---'},
                {'id':15, 'name':'Türkyə'},
                {'id':45, 'name':'Azərbaycan'},
                {'id':60, 'name':'Rusya'},
                {'id':64, 'name':'Gürcüstan'},
                {'id':65, 'name':'Qazaxıstan'}];

<span>{{(olkes | filter: {id:45})[0].name}}</span>

আউটপুট: Azərbaycan


2

যদি আপনি পারেন তবে অ্যারে সূচকগুলি আইডি হিসাবে ব্যবহার করে আপনার JSON ডেটা স্ট্রাকচার ডিজাইন করুন। আপনি এমনকি আপনার জেএসওন অ্যারেগুলিকে "সাধারণকরণ" করতে পারেন যতক্ষণ না আপনি আরডি সূচকে "প্রাথমিক কী" এবং "বিদেশী কী" হিসাবে আরডিবিএমএস এর মতো ব্যবহার করতে সমস্যা হন। যেমন, ভবিষ্যতে, আপনি এমনকি এর মতো কিছু করতে পারেন:

function getParentById(childID) {
var parentObject = parentArray[childArray[childID].parentID];
return parentObject;
}

এটি সমাধান "বাই ডিজাইন" । আপনার ক্ষেত্রে, কেবল:

var nameToFind = results[idToQuery - 1].name;

অবশ্যই, যদি আপনার আইডি ফর্ম্যাটটি "XX-0001" এর মতো কিছু হয় যার এর অ্যারে সূচক 0 হয় তবে আপনি আইডি ম্যাপ করার জন্য কিছু স্ট্রিং ম্যানিপুলেশন করতে পারেন; বা অন্যথায় পুনরাবৃত্তি পদ্ধতির মাধ্যমে এগুলি সম্পর্কে কিছুই করা যায় না।


2

আমি জানি আমি উত্তর দিতে খুব দেরী করেছি তবে একেবারে না দেখিয়ে দেখাই ভাল :) :) এটি পাওয়ার জন্য ES6 উপায়:

$http.get("data/SampleData.json").then(response => {
let id = 'xyz';
let item = response.data.results.find(result => result.id === id);
console.log(item); //your desired item
});

2

আইডি দ্বারা অ্যারে থেকে (এক) উপাদান পাওয়ার সহজ উপায়:

সন্ধান () পদ্ধতিটি অ্যারেতে প্রথম উপাদানটির মান প্রদান করে যা সরবরাহিত পরীক্ষামূলক ক্রিয়াকে সন্তুষ্ট করে। অন্যথায় অপরিবর্তিত ফেরত দেওয়া হয়।

function isBigEnough(element) {
    return element >= 15;
}

var integers = [12, 5, 8, 130, 160, 44];
integers.find(isBigEnough); // 130  only one element - first

উপরের মন্তব্যে আপনাকে ফিল্টার () ব্যবহার এবং প্রথম উপাদান xx.filter () [0] ধরার দরকার নেই

অ্যারেতে বস্তুর জন্য একই

var foo = {
"results" : [{
    "id" : 1,
    "name" : "Test"
}, {
    "id" : 2,
    "name" : "Beispiel"
}, {
    "id" : 3,
    "name" : "Sample"
}
]};

var secondElement = foo.results.find(function(item){
    return item.id == 2;
});

var json = JSON.stringify(secondElement);
console.log(json);

অবশ্যই যদি আপনার একাধিক আইডি থাকে তবে সমস্ত বস্তু পেতে ফিল্টার () পদ্ধতিটি ব্যবহার করুন। চিয়ার্স

function isBigEnough(element) {
    return element >= 15;
}

var integers = [12, 5, 8, 130, 160, 44];
integers.find(isBigEnough); // 130  only one element - first

var foo = {
"results" : [{
    "id" : 1,
    "name" : "Test"
}, {
    "id" : 2,
    "name" : "Beispiel"
}, {
    "id" : 3,
    "name" : "Sample"
}
]};

var secondElement = foo.results.find(function(item){
    return item.id == 2;
});

var json = JSON.stringify(secondElement);
console.log(json);


0
    projectDetailsController.controller('ProjectDetailsCtrl', function ($scope, $routeParams, $http) {
    $http.get('data/projects.json').success(function(data) {

        $scope.projects = data;
        console.log(data);

        for(var i = 0; i < data.length; i++) {
        $scope.project = data[i];
        if($scope.project.name === $routeParams.projectName) {
            console.log('project-details',$scope.project);
        return $scope.project;
        }
        }

    });
});

এটি সত্যিই ভাল কিনা তা নিশ্চিত নয় তবে এটি আমার পক্ষে সহায়ক ছিল .. এটি সঠিকভাবে কাজ করার জন্য আমার I সুযোগ ব্যবহার করা দরকার।


0

"ফলাফল" অ্যারে অনুসন্ধান করতে $ সময়সীমা ব্যবহার করুন এবং একটি ফাংশন চালান

app.controller("Search", function ($scope, $timeout) {
        var foo = { "results": [
          {
             "id": 12,
             "name": "Test"
          },
          {
             "id": 2,
             "name": "Beispiel"
          },
          {
             "id": 3,
            "name": "Sample"
          }
        ] };
        $timeout(function () {
            for (var i = 0; i < foo.results.length; i++) {
                if (foo.results[i].id=== 2) {
                    $scope.name = foo.results[i].name;
                }
            }
        }, 10);

    });

0

আমি এই জাতীয় কৌণিক জাল ফিল্টার ব্যবহার করে ফলাফল অ্যারের উপরে পুনরাবৃত্তি করব:

var foundResultObject = getObjectFromResultsList (ফলাফল, 1);

function getObjectFromResultsList(results, resultIdToRetrieve) {
        return $filter('filter')(results, { id: resultIdToRetrieve }, true)[0];
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.