একটি অ্যারের মধ্যে একটি সম্পত্তি মান যোগ করার ভাল উপায়


184

আমার এরকম কিছু রয়েছে:

$scope.traveler = [
            {  description: 'Senior', Amount: 50},
            {  description: 'Senior', Amount: 50},
            {  description: 'Adult', Amount: 75},
            {  description: 'Child', Amount: 35},
            {  description: 'Infant', Amount: 25 },
];

এই অ্যারের মোট পরিমাণ পেতে এখন আমি এই জাতীয় কিছু করছি:

$scope.totalAmount = function(){
       var total = 0;
       for (var i = 0; i < $scope.traveler.length; i++) {
              total = total + $scope.traveler[i].Amount;
            }
       return total;
}

কেবলমাত্র একটি অ্যারে হলে এটি সহজ, তবে আমার অন্যরকম একটি পৃথক সম্পত্তির নাম রয়েছে যাতে আমি যোগ করতে চাই।

আমি এরকম কিছু করতে পারলে আমি আরও সুখী হব:

$scope.traveler.Sum({ Amount });

তবে আমি কীভাবে এমনভাবে যেতে পারি তা ভবিষ্যতে এইরূপে পুনরায় ব্যবহার করতে পারলাম না:

$scope.someArray.Sum({ someProperty });

উত্তর

আমি @ গ্রুফ-বানির পরামর্শটি ব্যবহার করার সিদ্ধান্ত নিয়েছি, তাই আমি নেটিভ অবজেক্ট (অ্যারে) প্রোটোটাইপিং এড়াতে চাই

আমি অ্যারের বৈধতা দিয়ে তার উত্তরে সামান্য পরিবর্তন করেছি এবং যোগফলের মানটি শূন্য নয়, এটি আমার চূড়ান্ত বাস্তবায়ন:

$scope.sum = function (items, prop) {
    if (items == null) {
        return 0;
    }
    return items.reduce(function (a, b) {
        return b[prop] == null ? a : a + b[prop];
    }, 0);
};

2
তুমি তোমার পোস্ট করতে পারে উত্তর একটি হিসাবে উত্তর
কেন কিন

উত্তর:


124

আপডেট উত্তর

অ্যারে প্রোটোটাইপে কোনও ফাংশন যুক্ত করার সমস্ত ডাউনসাইডের কারণে, আমি এই উত্তরটি আপডেট করছি যা একটি বিকল্প প্রদান করতে যা মূলত প্রশ্নে অনুরোধ করা সিনট্যাক্সের অনুরূপ সিনট্যাক্সকে রাখে।

class TravellerCollection extends Array {
    sum(key) {
        return this.reduce((a, b) => a + (b[key] || 0), 0);
    }
}
const traveler = new TravellerCollection(...[
    {  description: 'Senior', Amount: 50},
    {  description: 'Senior', Amount: 50},
    {  description: 'Adult', Amount: 75},
    {  description: 'Child', Amount: 35},
    {  description: 'Infant', Amount: 25 },
]);

console.log(traveler.sum('Amount')); //~> 235

আসল উত্তর

এটি একটি অ্যারে হওয়ায় আপনি অ্যারে প্রোটোটাইপে কোনও ফাংশন যুক্ত করতে পারেন।

traveler = [
    {  description: 'Senior', Amount: 50},
    {  description: 'Senior', Amount: 50},
    {  description: 'Adult', Amount: 75},
    {  description: 'Child', Amount: 35},
    {  description: 'Infant', Amount: 25 },
];

Array.prototype.sum = function (prop) {
    var total = 0
    for ( var i = 0, _len = this.length; i < _len; i++ ) {
        total += this[i][prop]
    }
    return total
}

console.log(traveler.sum("Amount"))

দ্য ফিডাল: http://jsfiddle.net/9BAmj/


1
ধন্যবাদ @ sp00m এখন আমি গ্রাফ-বান্নি যেমন উত্তর দিয়েছি ঠিক তেমনভাবে অ্যারে.আরডেসের সাথে আমার বাস্তবায়ন পরিবর্তন করেছি।
nramirez

আপনার যদি পুরানো ব্রাউজারগুলিকে সমর্থন করতে হয় তবে আপনার হ্রাস ফাংশনটি পলফিল করতে হবে: বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

Array.prototypeভবিষ্যতে আপনার কোডটি ভঙ্গ হতে পারে দয়া করে প্রসারিত করবেন না । নেটিভ অবজেক্টগুলি বাড়ানো কেন একটি খারাপ অভ্যাস?
স্টার

@ বুটেনস যদি অ্যারেতে নাল বস্তু থাকে?
ওব্বি

228

আমি জানি যে এই প্রশ্নের একটি স্বীকৃত উত্তর আছে তবে আমি ভেবেছিলাম যে অ্যারে.আরডুস ব্যবহার করে এমন বিকল্পের সাথে আমি চিপ করব , কারণ অ্যারের যোগফলের যোগফল হ্রাস করার পক্ষে এক আদর্শ উদাহরণ:

$scope.sum = function(items, prop){
    return items.reduce( function(a, b){
        return a + b[prop];
    }, 0);
};

$scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');

Fiddle


উজ্জ্বল উত্তর, $scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');নিয়ামক ফাংশন শুরুতে রাখা সম্ভব ?
মো।

হ্যাঁ যদি যোগফলটি তৈরি হওয়ার পরে আসে।
গ্রুফ বানি

14
2015 সালের 6 ই অক্টোবর ডাউনটাটের কোনও কারণ? উত্তরটি নিয়ে যদি সমস্যা হয় তবে দয়া করে একটি মন্তব্য যুক্ত করুন এবং আমি এটি সংশোধন করব। নামবিহীন জনগণের কাছ থেকে কেউ শিক্ষা নেয় না।
গ্রুফ বানি

অ্যারের মধ্যে থাকা কোনও একটিতে প্রোপটি উপস্থিত (অপরিজ্ঞাত) না থাকলে এটি NaN এর ফলস্বরূপ হতে পারে। এটি সেরা চেক কিনা আমি জানি না, তবে এটি আমার ক্ষেত্রে কাজ করেছে: ফাংশন (আইটেমস, প্রোপ) {ফিরিয়ে দিন আইটেমগুলি red রিড্রেস (ফাংশন (ক, খ) {যদি (! IsNaN (খ [প্রপ])) { a + b [prop];} অন্য {ফিরে a} {, 0); }
মৃত্তিকারণ

129

আরেকটি বিষয় বিবেচনা করুন, এটি nativeজাভাস্ক্রিপ্ট ফাংশন Mapএবং Reduceএটির জন্য নির্মিত হয়েছিল (মানচিত্র এবং হ্রাস অনেক ভাষায় পাওয়ার হাউস)।

var traveler = [{description: 'Senior', Amount: 50},
                {description: 'Senior', Amount: 50},
                {description: 'Adult', Amount: 75},
                {description: 'Child', Amount: 35},
                {description: 'Infant', Amount: 25}];

function amount(item){
  return item.Amount;
}

function sum(prev, next){
  return prev + next;
}

traveler.map(amount).reduce(sum);
// => 235;

// or use arrow functions
traveler.map(item => item.Amount).reduce((prev, next) => prev + next);

দ্রষ্টব্য : পৃথক ছোট ফাংশন করে আমরা সেগুলি আবার ব্যবহারের ক্ষমতা পেয়েছি।

// Example of reuse.
// Get only Amounts greater than 0;

// Also, while using Javascript, stick with camelCase.
// If you do decide to go against the standards, 
// then maintain your decision with all keys as in...

// { description: 'Senior', Amount: 50 }

// would be

// { Description: 'Senior', Amount: 50 };

var travelers = [{description: 'Senior', amount: 50},
                {description: 'Senior', amount: 50},
                {description: 'Adult', amount: 75},
                {description: 'Child', amount: 35},
                {description: 'Infant', amount: 0 }];

// Directly above Travelers array I changed "Amount" to "amount" to match standards.

function amount(item){
  return item.amount;
}

travelers.filter(amount);
// => [{description: 'Senior', amount: 50},
//     {description: 'Senior', amount: 50},
//     {description: 'Adult', amount: 75},
//     {description: 'Child', amount: 35}];
//     Does not include "Infant" as 0 is falsey.

4
return Number(item.Amount);কেবলমাত্র নম্বরটি পরীক্ষা করতে

4
আমি কেবল prevহ্রাস ফাংশনে ভেরিয়েবলের নাম নিয়ে তর্ক করব । আমার কাছে এটি বোঝায় যে আপনি অ্যারেতে পূর্বের মান পাচ্ছেন। তবে সত্যই এটি পূর্ববর্তী সমস্ত মান হ্রাস। আমি পছন্দ করি accumulator, aggregatorবা sumSoFarস্পষ্টতার জন্য।
carpiediem

93

আমি সবসময় প্রোটোটাইপ পদ্ধতি পরিবর্তন এবং লাইব্রেরি যুক্ত এড়াতে পারি তাই এটি আমার সমাধান:

হ্রাস অ্যারে প্রোটোটাইপ পদ্ধতি ব্যবহার করা যথেষ্ট

// + operator for casting to Number
items.reduce((a, b) => +a + +b.price, 0);

3
দ্বিতীয় প্যারামিটার (যা প্রাথমিক মান নির্ধারণ করে a) reduceবস্তুগুলির সাথে ব্যবহার করার সময় কৌতুক করে : প্রথম পুনরাবৃত্তিতে অ্যারের aপ্রথম অবজেক্টটি হবে না items, পরিবর্তে এটি হবে 0
পার্জিফল

একটি ফাংশন হিসাবে: const sumBy = (items, prop) => items.reduce((a, b) => +a + +b[prop], 0); ব্যবহার:sumBy(traveler, 'Amount') // => 235
রাফি

2
পুরানো স্কুল প্রোগ্রামার হিসাবে reduceসিনট্যাক্সটি আমার কাছে পুরোপুরি আবদ্ধ মনে হয় looks আমার মস্তিস্কটি এখনও " let total = 0; items.forEach((item) => { total += item.price; });
নেটিভালি

1
@ আন্ডারউইজআর আমি আপনার সমাধানটি সর্বোত্তম পছন্দ করি। নেটিভ যেমন এটি একটি গুঞ্জনযুক্ত শব্দ হিসাবে ব্যবহার করা হয় যা এর জন্য কী বোঝায় তা খুব কমই ব্যাখ্যা করা যায়। আমি আপনার সমাধানের উপর ভিত্তি করে কোডের আরও একটি বেসিক লাইন তৈরি করেছি এবং এটি দুর্দান্ত কাজ করেছে। let total = 0; items.forEach(item => total += item.price)
ইয়ান পোস্টন ফ্রেমার

22

আমি ভেবেছিলাম যে আমি এটিতে আমার দুটি সেন্ট ফেলে দেব: এটি কোনও অপারেশন যা সর্বদা খাঁটিভাবে কার্যকর হওয়া উচিত, কোনও বাহ্যিক ভেরিয়েবলের উপর নির্ভর না করে। কিছু ইতিমধ্যে একটি ভাল উত্তর দিয়েছেন, এখানে ব্যবহার reduceকরার উপায় ব্যবহার করে ।

যেহেতু আমাদের বেশিরভাগই ইতিমধ্যে ES2015 সিনট্যাক্স ব্যবহারের সামর্থ বহন করতে পারি, তাই আমার প্রস্তাবটি এখানে:

const sumValues = (obj) => Object.keys(obj).reduce((acc, value) => acc + obj[value], 0);

আমরা যখন থাকি তখন আমরা এটিকে একটি অপরিবর্তনীয় ক্রিয়ায় পরিণত করছি। কি reduceমান সমেত শুরু করুন: এখানে কি করছে কেবল এই হল 0সঁচায়ক জন্য, এবং এটি বর্তমান কর্তিত আইটেমের মূল্য যোগ করুন।

ক্রিয়ামূলক প্রোগ্রামিং এবং ইএস ২০১৫ এর জন্য হ্যাঁ! :)


22

উন্নত পাঠযোগ্যতা এবং ব্যবহারের বিকল্প Mapএবং Reduce:

const traveler = [
    {  description: 'Senior', amount: 50 },
    {  description: 'Senior', amount: 50 },
    {  description: 'Adult', amount: 75 },
    {  description: 'Child', amount: 35 },
    {  description: 'Infant', amount: 25 },
];

const sum = traveler
  .map(item => item.amount)
  .reduce((prev, curr) => prev + curr, 0);

পুনরায় ব্যবহারযোগ্য ফাংশন:

const calculateSum = (obj, field) => obj
  .map(items => items.attributes[field])
  .reduce((prev, curr) => prev + curr, 0);

পারফেক্ট সাথী, "+1"
মায়াঙ্ক পান্ডেজ

ডিফল্ট মান হ্রাস করুন ব্যবহারের ক্ষেত্রে .reduce(*** => *** + ***, 0);অন্যরা "+1" অনুপস্থিত ছিল
এফডিস্ক ২is

19

আপনি নিম্নলিখিতটি করতে পারেন:

$scope.traveler.map(o=>o.Amount).reduce((a,c)=>a+c);

13

এটি আমার জন্য কাজ করছে TypeScriptএবং JavaScript:

let lst = [
     { description:'Senior', price: 10},
     { description:'Adult', price: 20},
     { description:'Child', price: 30}
];
let sum = lst.map(o => o.price).reduce((a, c) => { return a + c });
console.log(sum);

আমি আশা করি দরকারী।


4

আমি নিশ্চিত যে এটি এখনও উল্লেখ করা হয়েছে। তবে তার জন্য একটি লড্যাশ ফাংশন রয়েছে। নীচে স্নিপেট যেখানে মানটি আপনার গুণকের যোগফলের মান হ'ল 'মান'।

_.sumBy(objects, 'value');
_.sumBy(objects, function(o) { return o.value; });

দুজনেই কাজ করবে।



1

ES6 তীর ফাংশন ব্যবহার করে এখানে একটি ওয়ান-লাইনার দেওয়া হয়েছে।

const sumPropertyValue = (items, prop) => items.reduce((a, b) => a + b[prop], 0);

// usage:
const cart_items = [ {quantity: 3}, {quantity: 4}, {quantity: 2} ];
const cart_total = sumPropertyValue(cart_items, 'quantity');

1

জাভাস্ক্রিপ্ট ব্যবহার করে কীভাবে অবজেক্টের অ্যারে যোগ করা যায়

const traveler = [
  {  description: 'Senior', Amount: 50},
  {  description: 'Senior', Amount: 50},
  {  description: 'Adult', Amount: 75},
  {  description: 'Child', Amount: 35},
  {  description: 'Infant', Amount: 25 }
];

const traveler = [
    {  description: 'Senior', Amount: 50},
    {  description: 'Senior', Amount: 50},
    {  description: 'Adult', Amount: 75},
    {  description: 'Child', Amount: 35},
    {  description: 'Infant', Amount: 25 },
];
function sum(arrayData, key){
   return arrayData.reduce((a,b) => {
  return {Amount : a.Amount + b.Amount}
})
}
console.log(sum(traveler))
`


1

অবজেক্টের অ্যারে থেকে

function getSum(array, column)
  let values = array.map((item) => parseInt(item[column]) || 0)
  return values.reduce((a, b) => a + b)
}

foo = [
  { a: 1, b: "" },
  { a: null, b: 2 },
  { a: 1, b: 2 },
  { a: 1, b: 2 },
]

getSum(foo, a) == 3
getSum(foo, b) == 6

0

আমি ইতিমধ্যে jquery ব্যবহার ছিল। তবে আমি মনে করি কেবল এটির জন্য যথেষ্ট স্বজ্ঞাত:

var total_amount = 0; 
$.each(traveler, function( i, v ) { total_amount += v.Amount ; });

এটি মূলত @ আখুরির উত্তরের একটি সংক্ষিপ্ত সংস্করণ।


0

আমি আরও নমনীয় মনে করি এমন একটি সমাধান এখানে:

function sumOfArrayWithParameter (array, parameter) {
  let sum = null;
  if (array && array.length > 0 && typeof parameter === 'string') {
    sum = 0;
    for (let e of array) if (e && e.hasOwnProperty(parameter)) sum += e[parameter];
  }
  return sum;
}

যোগফল পেতে, কেবল এটির মতো ব্যবহার করুন:

let sum = sumOfArrayWithParameter(someArray, 'someProperty');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.